From 92f28962efe7b6a8c8abb824353a917840a9a452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:16:19 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=8C=87=E6=A0=87=E5=AD=90=E9=9B=86?= =?UTF-8?q?=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/encodings.xml | 5 +- manager-admin/pom.xml | 9 + manager-admin/src/main/demo.html | 806 +++--------------- .../com/hshh/{Init.java => AdminInit.java} | 18 +- .../hshh/data/controller/DataController.java | 24 +- .../com/hshh/evaluation/bean/BarData.java | 19 + .../hshh/evaluation/bean/CsvUploadBean.java | 19 + ...equest.java => PageDatasourceRequest.java} | 2 +- ...equest.java => PageEvaluationRequest.java} | 13 +- .../evaluation/bean/PageIndicatorWeight.java | 22 + ...est.java => PageMetricComputeRequest.java} | 4 +- ...e.java => PageMetricComputerResponse.java} | 2 +- ...n.java => PageMetricMapperWeightBean.java} | 3 +- ...an.java => PageMetricTableHeaderBean.java} | 2 +- .../com/hshh/evaluation/bean/PieData.java | 22 + .../com/hshh/evaluation/bean/ReportBean.java | 28 + .../bean/ReportIndicatorNodeData.java | 28 + .../evaluation/bean/SingleEvaluationData.java | 19 + ...ynamicTable.java => pageDynamicTable.java} | 6 +- .../AssistantEvaluationProjectController.java | 145 ++++ .../AssistantTemplateController.java | 61 +- .../EvaluationCsvDataController.java | 18 - .../EvaluationHistoryController.java | 18 - .../EvaluationProjectController.java | 297 ++++++- .../EvaluationResultController.java | 18 - .../EvaluationTemplateController.java | 58 +- ...tionTemplateIndicatorWeightController.java | 18 - .../evaluation/entity/EvaluationCsvData.java | 18 +- .../evaluation/entity/EvaluationHistory.java | 4 + .../evaluation/entity/EvaluationResult.java | 45 - .../evaluation/entity/EvaluationTemplate.java | 19 +- .../mapper/EvaluationCsvDataMapper.java | 32 +- .../mapper/EvaluationHistoryMapper.java | 10 +- .../mapper/EvaluationResultMapper.java | 16 - .../service/CoreEvaluationService.java | 21 + .../service/EvaluationCsvDataService.java | 50 ++ .../service/EvaluationHistoryService.java | 24 + .../service/EvaluationProjectService.java | 13 +- .../service/EvaluationResultService.java | 16 - ...luationTemplateIndicatorWeightService.java | 23 +- .../service/EvaluationTemplateService.java | 6 +- .../EvaluationTemplateWeightService.java | 47 +- .../service/IEvaluationCsvDataService.java | 16 - .../impl/CoreEvaluationServiceImpl.java | 514 +++++++++++ .../impl/EvaluationCsvDataServiceImpl.java | 53 +- .../impl/EvaluationHistoryServiceImpl.java | 40 +- .../impl/EvaluationProjectServiceImpl.java | 197 ++--- .../impl/EvaluationResultServiceImpl.java | 21 - ...ionTemplateIndicatorWeightServiceImpl.java | 25 +- .../impl/EvaluationTemplateServiceImpl.java | 96 ++- .../EvaluationTemplateWeightServiceImpl.java | 51 +- .../indicator/bean/IndicatorEvalBean.java | 26 + .../hshh/indicator/bean/IndicatorSetBean.java | 19 + .../controller/EvaluationController.java | 170 ++-- .../controller/IndicatorController.java | 7 +- .../controller/IndicatorSetController.java | 42 + .../com/hshh/indicator/entity/Indicator.java | 11 + .../entity/IndicatorBottomCsvMapper.java | 80 +- .../entity/IndicatorBottomFormMapper.java | 8 +- .../indicator/entity/IndicatorEvalItem.java | 23 +- .../indicator/entity/IndicatorFormMapper.java | 2 + .../IndicatorBottomCsvMapperMapper.java | 10 +- .../mapper/IndicatorBottomMapperMapper.java | 12 +- .../IndicatorBottomCsvMapperService.java | 8 + .../IndicatorBottomFormMapperService.java | 7 + .../service/IndicatorEvalItemService.java | 35 +- .../IndicatorBottomCsvMapperServiceImpl.java | 6 + .../IndicatorBottomMapperServiceImpl.java | 5 + .../impl/IndicatorEvalItemServiceImpl.java | 48 +- .../hshh/model/mapper/FormValueMapper.java | 9 + .../hshh/model/service/FormValueService.java | 9 + .../service/impl/FormValueServiceImpl.java | 5 + ...ad.java => HandleEvaluationCmdThread.java} | 6 +- .../src/main/resources/application.yaml | 4 +- .../mapper/EvaluationCsvDataMapper.xml | 67 ++ .../mapper/EvaluationHistoryMapper.xml | 11 +- .../mapper/EvaluationResultMapper.xml | 5 - .../main/resources/mapper/FormValueMapper.xml | 23 +- .../mapper/IndicatorBottomCsvMapperMapper.xml | 9 + .../mapper/IndicatorBottomMapperMapper.xml | 10 +- .../mapper/IndicatorFormMapperMapper.xml | 1 + .../main/resources/static/js/common/common.js | 31 +- .../main/resources/static/js/crypto-js.min.js | 1 + .../resources/static/js/html2canvas.min.js | 20 + .../main/resources/static/js/jspdf.umd.min.js | 398 +++++++++ .../main/resources/templates/data/list.html | 11 +- .../main/resources/templates/error/404.html | 12 + .../main/resources/templates/error/500.html | 13 + .../resources/templates/fragments/dialog.html | 49 +- .../src/main/resources/templates/home.html | 41 +- .../templates/indicator/add_evaluation.html | 60 -- .../templates/indicator/evaluation_list.html | 397 +++++---- .../templates/indicator/indicator_mapper.html | 19 +- .../src/main/resources/templates/login.html | 9 +- .../templates/project/datasource_csv.html | 70 +- .../templates/project/datasource_db.html | 8 +- .../templates/project/datasource_select.html | 88 +- .../templates/project/evaluation_history.html | 42 + .../templates/project/evaluation_report.html | 748 ++++++++++++++++ .../project/evaluation_root_history.html | 54 ++ .../resources/templates/project/list.html | 549 +++++++++++- .../project/project_evaluation_process.html | 5 - .../templates/project_template/list.html | 126 ++- .../system/indicator/indicator_set.html | 190 +++++ .../templates/system/log/general_detail.html | 84 ++ .../resources/templates/system/log/list.html | 140 +++ .../resources/templates/system/menu/add.html | 2 +- .../resources/templates/system/menu/list.html | 1 + .../templates/system/permission/add.html | 6 +- .../resources/templates/system/role/add.html | 12 +- .../resources/templates/system/role/list.html | 3 +- .../test/java/com/hshh/ApplicationTest.java | 30 - manager-system/pom.xml | 22 + .../src/main/java/com/hshh/system/Global.java | 5 + .../com/hshh/system/algorithm/AesDecrypt.java | 51 ++ .../algorithm => algorithm/ahp}/Ahp.java | 2 +- .../algorithm => algorithm/ahp}/AhpNode.java | 2 +- .../ahp}/AhpTreeCompute.java | 2 +- .../algorithm/fuzzy/EvaluationLevel.java | 31 + .../fuzzy/FuzzyEvaluationService.java | 192 +++++ .../algorithm/fuzzy/FuzzyEvaluationTest.java | 128 +++ .../system/algorithm/fuzzy/FuzzyOperator.java | 28 + .../fuzzy/GlobalEvaluationConfig.java | 53 ++ .../fuzzy/GlobalMembershipFunction.java | 137 +++ .../system/algorithm/fuzzy/GradeRange.java | 29 + .../system/algorithm/fuzzy/IndicatorNode.java | 56 ++ .../LeafFullTriangularMembershipFunction.java | 196 +++++ .../fuzzy/LeafHybridMembershipFunction.java | 249 ++++++ .../algorithm/fuzzy/MembershipFunction.java | 17 + .../hshh/system/annotation/LogOperation.java | 22 + .../system/aspect/LogOperationAspect.java | 75 ++ .../auth/controller/LoginController.java | 69 +- .../base/controller/MenuController.java | 4 + .../base/controller/PermissionController.java | 3 + .../base/controller/RoleController.java | 5 +- .../base/controller/UserController.java | 3 + .../hshh/system/base/entity/Permissions.java | 2 +- .../com/hshh/system/base/entity/Roles.java | 19 +- .../system/base/service/RolesService.java | 2 +- .../base/service/impl/MenusServiceImpl.java | 5 +- .../base/service/impl/RolesServiceImpl.java | 4 +- .../com/hshh/system/cache/CacheService.java | 38 + .../common/Strings/StringOperationUtil.java | 45 - .../system/common/Strings/StringUtil.java | 130 +++ .../system/common/bean/BaseController.java | 4 + .../system/common/bean/PaginationBean.java | 15 +- .../common/enums/AggregationMethod.java | 13 +- .../hshh/system/common/enums/LevelEnum.java | 61 ++ .../com/hshh/system/common/jwt/JwtUtil.java | 25 +- .../hshh/system/common/util/DraftStore.java | 50 -- .../com/hshh/system/common/util/IpUtil.java | 34 + .../util/MultiReadHttpServletRequest.java | 73 ++ .../com/hshh/system/config/CacheConfig.java | 38 + .../exception/ApiGlobalExceptionHandler.java | 66 ++ .../system/exception/PageErrorController.java | 38 + .../system/filter/MultiReadRequestFilter.java | 51 ++ .../com/hshh/system/fuzzy/package-info.java | 10 + .../hshh/system/logs/LogRecorderThread.java | 42 + .../hshh/system/ws/WsEvaluationServer.java | 9 + .../src/main/resources/mapper/RolesMapper.xml | 8 +- .../src/main/java/CodeGenerator.java | 4 +- pom.xml | 2 +- 162 files changed, 7105 insertions(+), 2002 deletions(-) rename manager-admin/src/main/java/com/hshh/{Init.java => AdminInit.java} (61%) create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/bean/BarData.java create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/bean/CsvUploadBean.java rename manager-admin/src/main/java/com/hshh/evaluation/bean/{DatasourceRequest.java => PageDatasourceRequest.java} (85%) rename manager-admin/src/main/java/com/hshh/evaluation/bean/{EvaluationRequest.java => PageEvaluationRequest.java} (68%) create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/bean/PageIndicatorWeight.java rename manager-admin/src/main/java/com/hshh/evaluation/bean/{MetricComputeRequest.java => PageMetricComputeRequest.java} (66%) rename manager-admin/src/main/java/com/hshh/evaluation/bean/{MetricComputerResponse.java => PageMetricComputerResponse.java} (81%) rename manager-admin/src/main/java/com/hshh/evaluation/bean/{MetricMapperWeightBean.java => PageMetricMapperWeightBean.java} (90%) rename manager-admin/src/main/java/com/hshh/evaluation/bean/{MetricTableHeaderBean.java => PageMetricTableHeaderBean.java} (81%) create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/bean/PieData.java create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/bean/ReportBean.java create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/bean/ReportIndicatorNodeData.java create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/bean/SingleEvaluationData.java rename manager-admin/src/main/java/com/hshh/evaluation/bean/{DynamicTable.java => pageDynamicTable.java} (60%) create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/controller/AssistantEvaluationProjectController.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationCsvDataController.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationHistoryController.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationResultController.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationTemplateIndicatorWeightController.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationResult.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationResultMapper.java create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/service/CoreEvaluationService.java create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationCsvDataService.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationResultService.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/service/IEvaluationCsvDataService.java create mode 100644 manager-admin/src/main/java/com/hshh/evaluation/service/impl/CoreEvaluationServiceImpl.java delete mode 100644 manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationResultServiceImpl.java create mode 100644 manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorEvalBean.java create mode 100644 manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorSetBean.java create mode 100644 manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorSetController.java rename manager-admin/src/main/java/com/hshh/thread/{HandleCmdThread.java => HandleEvaluationCmdThread.java} (84%) delete mode 100644 manager-admin/src/main/resources/mapper/EvaluationResultMapper.xml create mode 100644 manager-admin/src/main/resources/static/js/crypto-js.min.js create mode 100644 manager-admin/src/main/resources/static/js/html2canvas.min.js create mode 100644 manager-admin/src/main/resources/static/js/jspdf.umd.min.js create mode 100644 manager-admin/src/main/resources/templates/error/404.html create mode 100644 manager-admin/src/main/resources/templates/error/500.html delete mode 100644 manager-admin/src/main/resources/templates/indicator/add_evaluation.html create mode 100644 manager-admin/src/main/resources/templates/project/evaluation_history.html create mode 100644 manager-admin/src/main/resources/templates/project/evaluation_report.html create mode 100644 manager-admin/src/main/resources/templates/project/evaluation_root_history.html create mode 100644 manager-admin/src/main/resources/templates/system/indicator/indicator_set.html create mode 100644 manager-admin/src/main/resources/templates/system/log/general_detail.html create mode 100644 manager-admin/src/main/resources/templates/system/log/list.html create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/AesDecrypt.java rename manager-system/src/main/java/com/hshh/system/{common/algorithm => algorithm/ahp}/Ahp.java (98%) rename manager-system/src/main/java/com/hshh/system/{common/algorithm => algorithm/ahp}/AhpNode.java (95%) rename manager-system/src/main/java/com/hshh/system/{common/algorithm => algorithm/ahp}/AhpTreeCompute.java (98%) create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/EvaluationLevel.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationService.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationTest.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyOperator.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GlobalEvaluationConfig.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GlobalMembershipFunction.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GradeRange.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/IndicatorNode.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafFullTriangularMembershipFunction.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafHybridMembershipFunction.java create mode 100644 manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/MembershipFunction.java create mode 100644 manager-system/src/main/java/com/hshh/system/annotation/LogOperation.java create mode 100644 manager-system/src/main/java/com/hshh/system/aspect/LogOperationAspect.java create mode 100644 manager-system/src/main/java/com/hshh/system/cache/CacheService.java delete mode 100644 manager-system/src/main/java/com/hshh/system/common/Strings/StringOperationUtil.java create mode 100644 manager-system/src/main/java/com/hshh/system/common/Strings/StringUtil.java create mode 100644 manager-system/src/main/java/com/hshh/system/common/enums/LevelEnum.java delete mode 100644 manager-system/src/main/java/com/hshh/system/common/util/DraftStore.java create mode 100644 manager-system/src/main/java/com/hshh/system/common/util/IpUtil.java create mode 100644 manager-system/src/main/java/com/hshh/system/common/util/MultiReadHttpServletRequest.java create mode 100644 manager-system/src/main/java/com/hshh/system/config/CacheConfig.java create mode 100644 manager-system/src/main/java/com/hshh/system/exception/ApiGlobalExceptionHandler.java create mode 100644 manager-system/src/main/java/com/hshh/system/exception/PageErrorController.java create mode 100644 manager-system/src/main/java/com/hshh/system/filter/MultiReadRequestFilter.java create mode 100644 manager-system/src/main/java/com/hshh/system/fuzzy/package-info.java create mode 100644 manager-system/src/main/java/com/hshh/system/logs/LogRecorderThread.java diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 421d0d2..85e39dd 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,14 +1,11 @@ - + - - - diff --git a/manager-admin/pom.xml b/manager-admin/pom.xml index 2dd1e65..8605d3a 100644 --- a/manager-admin/pom.xml +++ b/manager-admin/pom.xml @@ -39,6 +39,15 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 11 + 11 + + org.springframework.boot spring-boot-maven-plugin diff --git a/manager-admin/src/main/demo.html b/manager-admin/src/main/demo.html index ae536e0..41b895c 100644 --- a/manager-admin/src/main/demo.html +++ b/manager-admin/src/main/demo.html @@ -1,670 +1,140 @@ - - - - - - - - Logs - Tabler - Premium and Open Source dashboard template with responsive and high quality UI. - - - - - - - - - - -
- - - -
- - - -
-
-
-
-

- Checked URL -

- -

Request Timing

-
-
Effective URL            https://preview.tabler.io
Redirect count           0
Name lookup time         3.4e-05
Connect time             0.000521
Pre-transfer time        0.0
Start-transfer time      0.0
App connect time         0.0
Redirect time            0.0
Total time               28.000601
Response code            0
Return keyword           operation_timedout
-
-

Response Headers

-
-
HTTP/1.1 200 Connection established
-
-
- -
-
-
- + + +替换雷达为横向条形图 · 最小示例 + + +
+

一级维度得分对比

+
+
- - - - - - \ No newline at end of file + + + diff --git a/manager-admin/src/main/java/com/hshh/Init.java b/manager-admin/src/main/java/com/hshh/AdminInit.java similarity index 61% rename from manager-admin/src/main/java/com/hshh/Init.java rename to manager-admin/src/main/java/com/hshh/AdminInit.java index f43a2e9..959899c 100644 --- a/manager-admin/src/main/java/com/hshh/Init.java +++ b/manager-admin/src/main/java/com/hshh/AdminInit.java @@ -1,9 +1,12 @@ package com.hshh; +import com.hshh.system.base.service.LogsService; import com.hshh.system.common.threadpool.ThreadPools; -import com.hshh.thread.HandleCmdThread; +import com.hshh.system.logs.LogRecorderThread; +import com.hshh.thread.HandleEvaluationCmdThread; import java.util.concurrent.ExecutorService; import javax.annotation.PostConstruct; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -15,8 +18,10 @@ import org.springframework.stereotype.Component; */ @Component @Slf4j -public class Init { +public class AdminInit { + @Resource + private LogsService logsService; private static final ExecutorService cpu = ThreadPools.newCpuBoundPool("cpu-pool"); private static final int evaluationThreadNum = 5; @@ -25,16 +30,23 @@ public class Init { */ @PostConstruct public void init() { + //评估线程 startEvaluationThread(); + //日志记录线程 + startRecordLogs(); } private void startEvaluationThread() { try { for (int i = 0; i < evaluationThreadNum; i++) { - cpu.execute(new Thread(new HandleCmdThread())); + cpu.execute(new Thread(new HandleEvaluationCmdThread())); } } catch (Exception e) { log.error("error::", e); } } + + private void startRecordLogs() { + new Thread(new LogRecorderThread(logsService)).start(); + } } diff --git a/manager-admin/src/main/java/com/hshh/data/controller/DataController.java b/manager-admin/src/main/java/com/hshh/data/controller/DataController.java index a92ea73..ea681ae 100644 --- a/manager-admin/src/main/java/com/hshh/data/controller/DataController.java +++ b/manager-admin/src/main/java/com/hshh/data/controller/DataController.java @@ -7,6 +7,7 @@ import com.hshh.model.entity.ModelDefine; import com.hshh.model.service.FormFieldConfigService; import com.hshh.model.service.FormValueService; import com.hshh.model.service.ModelDefineService; +import com.hshh.system.annotation.LogOperation; import com.hshh.system.common.bean.BaseController; import com.hshh.system.common.bean.ErrorField; import com.hshh.system.common.bean.OperateResult; @@ -70,6 +71,7 @@ public class DataController extends BaseController { * @param model session容器 * @return /data/list.html */ + @LogOperation("进入数据管理") @GetMapping("/list") @Operation(summary = "导航到数据管理页面", description = "导航到数据管理页面") public String index(PaginationBean request, Model model) { @@ -81,12 +83,12 @@ public class DataController extends BaseController { model.addAttribute("modelDefineList", modelDefineList); //设置到session中 - if (!modelDefineList.isEmpty()) { + if (!modelDefineList.isEmpty() && request.getBusinessKey() != null) { List formConfigList = formFieldConfigService.getFormFieldConfigByModelId( - (request.getId() == null ? modelDefineList.get(0).getId() : request.getId())); //查询模型表头 + request.getBusinessKey()); //查询模型表头 sortFieldList(formConfigList); //排序 - Map headerMap = new LinkedHashMap<>(); //定义表头兑现 + Map headerMap = new LinkedHashMap<>(); //定义表头 formConfigList.forEach(formFieldConfig -> { headerMap.put(formFieldConfig.getFieldName(), formFieldConfig.getFieldLabel()); }); @@ -114,10 +116,10 @@ public class DataController extends BaseController { */ private void setCurrentActiveModelDefine(Model model, PaginationBean request, List modelDefineList) { - AtomicReference activeModelDefine = new AtomicReference<>(); //当前激活的数据模型;tab页 + AtomicReference activeModelDefine = new AtomicReference<>(); modelDefineList.forEach(a -> { - if (request.getId() != null && request.getId().equals(a.getId())) { + if (request.getBusinessKey() != null && request.getBusinessKey().equals(a.getId())) { a.setChecked(true); activeModelDefine.set(a); @@ -129,15 +131,6 @@ public class DataController extends BaseController { }); if (activeModelDefine.get() != null) { model.addAttribute("currentModelDefine", activeModelDefine.get()); - } else { - //设置默认第一个选中 - if (!modelDefineList.isEmpty()) { - modelDefineList.get(0).setChecked(true); - //设置查询参数为第一个 - request.setId(modelDefineList.get(0).getId()); - model.addAttribute("currentModelDefine", modelDefineList.get(0)); - } - } } @@ -157,6 +150,7 @@ public class DataController extends BaseController { * @param id 模型id * @return form表单内容 div... */ + @LogOperation("获取form输入窗体") @GetMapping("/getForm/{id}") @Operation(summary = "获取form输入窗体", description = "根据模型ID获取form窗体") @ResponseBody @@ -171,6 +165,7 @@ public class DataController extends BaseController { * @param formValue 表单值 * @return 操作结果 */ + @LogOperation("保存对应模型ID对应的form表单记录") @PostMapping("/form/save") @ResponseBody @Operation(summary = "保存记录", description = "保存对应模型ID对应的form表单记录") @@ -194,6 +189,7 @@ public class DataController extends BaseController { * @param id 记录ID * @return 操作结果 */ + @LogOperation("根据ID删除记录") @ResponseBody @GetMapping("/remove/{id}") @Operation(summary = "删除记录", description = "根据ID删除记录") diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/BarData.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/BarData.java new file mode 100644 index 0000000..950682e --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/BarData.java @@ -0,0 +1,19 @@ +package com.hshh.evaluation.bean; + +import lombok.Data; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class BarData { + + private String name; + private double score; +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/CsvUploadBean.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/CsvUploadBean.java new file mode 100644 index 0000000..ac09cbd --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/CsvUploadBean.java @@ -0,0 +1,19 @@ +package com.hshh.evaluation.bean; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.web.multipart.MultipartFile; + +/** + * csv上传文件描述类. + * + * @author LiDongYU + * @since 2025/7/22 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class CsvUploadBean extends PageEvaluationRequest { + + private MultipartFile file; + +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/DatasourceRequest.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageDatasourceRequest.java similarity index 85% rename from manager-admin/src/main/java/com/hshh/evaluation/bean/DatasourceRequest.java rename to manager-admin/src/main/java/com/hshh/evaluation/bean/PageDatasourceRequest.java index a789dd0..23fe4da 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/bean/DatasourceRequest.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageDatasourceRequest.java @@ -10,7 +10,7 @@ import lombok.Data; * @since 2025/7/22 */ @Data -public class DatasourceRequest implements Serializable { +public class PageDatasourceRequest implements Serializable { private static final long serialVersionUID = 1L; //数据源类型 数据库||Csv文件 diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/EvaluationRequest.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageEvaluationRequest.java similarity index 68% rename from manager-admin/src/main/java/com/hshh/evaluation/bean/EvaluationRequest.java rename to manager-admin/src/main/java/com/hshh/evaluation/bean/PageEvaluationRequest.java index 80420d8..097b6e7 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/bean/EvaluationRequest.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageEvaluationRequest.java @@ -9,7 +9,7 @@ import lombok.Data; * @since 2025/7/22 */ @Data -public class EvaluationRequest { +public class PageEvaluationRequest { /** * database | csv. @@ -36,7 +36,16 @@ public class EvaluationRequest { */ private String randomKey; /** - * 计算方式 + * 计算方式. */ private String method; + private Integer indicatorTopId; + /** + * 用户ID. + */ + private Integer userId; + private String membership; + private int[] ids; + //csv数据标识字段 + private String identifier; } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/PageIndicatorWeight.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageIndicatorWeight.java new file mode 100644 index 0000000..3ce409e --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageIndicatorWeight.java @@ -0,0 +1,22 @@ +package com.hshh.evaluation.bean; + +import lombok.Data; + +/** + * 页面指标权重. + * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class PageIndicatorWeight { + + /** + * 指标ID. + */ + private int indicatorId; + /** + * 权重. + */ + private String weight; +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/MetricComputeRequest.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricComputeRequest.java similarity index 66% rename from manager-admin/src/main/java/com/hshh/evaluation/bean/MetricComputeRequest.java rename to manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricComputeRequest.java index 3619516..5de9346 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/bean/MetricComputeRequest.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricComputeRequest.java @@ -10,9 +10,9 @@ import lombok.Data; * @since 2025/7/22 */ @Data -public class MetricComputeRequest { +public class PageMetricComputeRequest { private List metric; - private List> weightList; + private List> weightList; } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/MetricComputerResponse.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricComputerResponse.java similarity index 81% rename from manager-admin/src/main/java/com/hshh/evaluation/bean/MetricComputerResponse.java rename to manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricComputerResponse.java index 4bcd1eb..5408508 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/bean/MetricComputerResponse.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricComputerResponse.java @@ -9,7 +9,7 @@ import lombok.Data; * @since 2025/7/22 */ @Data -public class MetricComputerResponse { +public class PageMetricComputerResponse { private String id; private String weight; diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/MetricMapperWeightBean.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricMapperWeightBean.java similarity index 90% rename from manager-admin/src/main/java/com/hshh/evaluation/bean/MetricMapperWeightBean.java rename to manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricMapperWeightBean.java index e623d1c..efaebdd 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/bean/MetricMapperWeightBean.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricMapperWeightBean.java @@ -9,7 +9,7 @@ import lombok.Data; * @since 2025/7/22 */ @Data -public class MetricMapperWeightBean { +public class PageMetricMapperWeightBean { /** * 从那个指标开始. @@ -31,4 +31,5 @@ public class MetricMapperWeightBean { * 行号. */ private int rowNum; + } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/MetricTableHeaderBean.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricTableHeaderBean.java similarity index 81% rename from manager-admin/src/main/java/com/hshh/evaluation/bean/MetricTableHeaderBean.java rename to manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricTableHeaderBean.java index c60756b..b30beac 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/bean/MetricTableHeaderBean.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/PageMetricTableHeaderBean.java @@ -9,7 +9,7 @@ import lombok.Data; * @since 2025/7/22 */ @Data -public class MetricTableHeaderBean { +public class PageMetricTableHeaderBean { private int id; private String name; diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/PieData.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/PieData.java new file mode 100644 index 0000000..af0ec6e --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/PieData.java @@ -0,0 +1,22 @@ +package com.hshh.evaluation.bean; + +import java.io.Serializable; +import lombok.Data; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class PieData implements Serializable { + + private static final long serialVersionUID = 1L; + private String label; + private double value; + private String color; +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/ReportBean.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/ReportBean.java new file mode 100644 index 0000000..c247dab --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/ReportBean.java @@ -0,0 +1,28 @@ +package com.hshh.evaluation.bean; + +import com.hshh.evaluation.entity.EvaluationRootResult; +import com.hshh.indicator.entity.IndicatorTopLevel; +import java.io.Serializable; +import java.util.List; +import lombok.Data; + +/** + * 报告模板类. + * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class ReportBean implements Serializable { + + private EvaluationRootResult result; + private List levelList; + private String highRate; + private Integer bottomNum; + + private List pieDataList; + + private List dataNodeList; + private List barDataList; + +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/ReportIndicatorNodeData.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/ReportIndicatorNodeData.java new file mode 100644 index 0000000..416a2a5 --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/ReportIndicatorNodeData.java @@ -0,0 +1,28 @@ +package com.hshh.evaluation.bean; + +import java.io.Serializable; +import java.util.Map; +import lombok.Data; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class ReportIndicatorNodeData implements Serializable { + + private static final long serialVersionUID = 1L; + private String id; + private String name; + private Integer level; + private double score; + private Map membershipDist; + private double weight; + private String parent; + private String evaluation; +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/SingleEvaluationData.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/SingleEvaluationData.java new file mode 100644 index 0000000..b82e1c0 --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/SingleEvaluationData.java @@ -0,0 +1,19 @@ +package com.hshh.evaluation.bean; + +import lombok.Data; + +/** + * 评估数据描述.原始数据id,实际数据data,type=csv or database. + * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class SingleEvaluationData { + + private int id; + private String data; + private String type; + + +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/bean/DynamicTable.java b/manager-admin/src/main/java/com/hshh/evaluation/bean/pageDynamicTable.java similarity index 60% rename from manager-admin/src/main/java/com/hshh/evaluation/bean/DynamicTable.java rename to manager-admin/src/main/java/com/hshh/evaluation/bean/pageDynamicTable.java index db29f98..38debc7 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/bean/DynamicTable.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/bean/pageDynamicTable.java @@ -11,14 +11,14 @@ import lombok.Data; * @since 2025/7/22 */ @Data -public class DynamicTable { +public class pageDynamicTable { /** * 表头map linkedMap. */ - private Map headerMap; + private Map headerMap; - private List> weight; + private List> weight; } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/controller/AssistantEvaluationProjectController.java b/manager-admin/src/main/java/com/hshh/evaluation/controller/AssistantEvaluationProjectController.java new file mode 100644 index 0000000..a213b26 --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/controller/AssistantEvaluationProjectController.java @@ -0,0 +1,145 @@ +package com.hshh.evaluation.controller; + +import com.hshh.evaluation.bean.BarData; +import com.hshh.evaluation.bean.PieData; +import com.hshh.evaluation.bean.ReportIndicatorNodeData; +import com.hshh.evaluation.entity.EvaluationIndicatorResult; +import com.hshh.evaluation.entity.EvaluationRootResult; +import com.hshh.indicator.entity.IndicatorTopLevel; +import com.hshh.system.common.bean.BaseController; +import com.hshh.system.common.enums.LevelEnum; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +public class AssistantEvaluationProjectController extends BaseController { + + protected Map membershipScoreMap(String input) { + Map map = new LinkedHashMap<>(); // 保证顺序和输入一致 + + for (String pair : input.split(";")) { + if (pair.trim().isEmpty()) { + continue; + } + String[] kv = pair.split(":"); + if (kv.length == 2) { + String key = kv[0].trim(); + double value = Double.parseDouble(kv[1].trim()); + map.put(key, value); + } + } + return map; + } + + protected String getClosestLevel(List levelList, int targetScore) { + IndicatorTopLevel closest = null; + int minDiff = Integer.MAX_VALUE; + for (IndicatorTopLevel item : levelList) { + int diff = Math.abs(targetScore - (int) Double.parseDouble(item.getGrade())); + if (diff < minDiff) { + minDiff = diff; + closest = item; + } + } + return closest != null ? closest.getLevelName() : null; + } + + //获取优良率 + protected String highRate(Map membershipMap) { + AtomicReference highRate = new AtomicReference<>((double) 0); + membershipMap.forEach((k, v) -> { + if (k.equals(LevelEnum.Excellent.getLevel())) { + highRate.set(highRate.get() + v); + } + if (k.equals(LevelEnum.Good.getLevel())) { + highRate.set(highRate.get() + v); + } + }); + return String.format("%.2f", highRate.get() * 100); + } + + protected void setLevelName(List levelList, EvaluationRootResult rootResult) { + if (levelList.isEmpty()) { + return; + } + rootResult.setLevelName(levelList.get(levelList.size() - 1).getLevelName()); + for (IndicatorTopLevel indicatorTopLevel : levelList) { + if (Double.parseDouble(rootResult.getFinalScore()) >= Double.parseDouble( + indicatorTopLevel.getGrade())) { + rootResult.setLevelName(indicatorTopLevel.getLevelName()); + break; + } + } + + } + + protected List pieDataList(Map membershipMap) { + List list = new ArrayList<>(); + membershipMap.forEach((k, v) -> { + PieData pieData = new PieData(); + pieData.setLabel(k); + pieData.setValue(v * 100); + pieData.setColor(LevelEnum.getColor(k)); + list.add(pieData); + }); + return list; + } + + protected List covertIndicatorResultToReportIndicatorNodeData( + List list, List levelList) { + List resultList = new ArrayList<>(); + list.forEach(indicatorResult -> { + ReportIndicatorNodeData reportIndicatorNodeData = new ReportIndicatorNodeData(); + resultList.add(reportIndicatorNodeData); + + reportIndicatorNodeData.setId("node_" + indicatorResult.getIndicatorId()); + reportIndicatorNodeData.setName(indicatorResult.getIndicatorName()); + reportIndicatorNodeData.setLevel(indicatorResult.getLevel()); + reportIndicatorNodeData.setScore( + new BigDecimal(indicatorResult.getFinalScore()).setScale(2, RoundingMode.HALF_UP) + .doubleValue()); + Map membershipScoreMap = new HashMap<>(); + Map originalMap = membershipScoreMap(indicatorResult.getMemberShipScore()); + + originalMap.forEach((k, v) -> { + membershipScoreMap.put(LevelEnum.getCode(k), + BigDecimal.valueOf(v * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); + }); + reportIndicatorNodeData.setMembershipDist(membershipScoreMap); + reportIndicatorNodeData.setEvaluation( + getClosestLevel(levelList, (int) reportIndicatorNodeData.getScore())); + reportIndicatorNodeData.setWeight(indicatorResult.getWeight()); + if (indicatorResult.getIndicatorParentId() != null) { + reportIndicatorNodeData.setParent("node_" + indicatorResult.getIndicatorParentId()); + } + }); + return resultList; + } + + protected List covertIndicatorResultToBarData(List list) { + List resultList = new ArrayList<>(); + list.forEach(indicatorResult -> { + BarData barData = new BarData(); + barData.setName(indicatorResult.getIndicatorName()); + barData.setScore( + new BigDecimal(indicatorResult.getFinalScore()).setScale(2, RoundingMode.HALF_UP) + .doubleValue()); + resultList.add(barData); + }); + return resultList; + } +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/controller/AssistantTemplateController.java b/manager-admin/src/main/java/com/hshh/evaluation/controller/AssistantTemplateController.java index d89937f..8602cdf 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/controller/AssistantTemplateController.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/controller/AssistantTemplateController.java @@ -1,8 +1,8 @@ package com.hshh.evaluation.controller; -import com.hshh.evaluation.bean.DynamicTable; -import com.hshh.evaluation.bean.MetricMapperWeightBean; -import com.hshh.evaluation.bean.MetricTableHeaderBean; +import com.hshh.evaluation.bean.PageMetricMapperWeightBean; +import com.hshh.evaluation.bean.PageMetricTableHeaderBean; +import com.hshh.evaluation.bean.pageDynamicTable; import com.hshh.evaluation.entity.EvaluationTemplateWeight; import com.hshh.indicator.entity.Indicator; import com.hshh.indicator.service.IndicatorService; @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 评估模板类辅助方法. @@ -29,7 +30,7 @@ public class AssistantTemplateController extends BaseController { * @return list string数组 */ protected List convertMetricMapperWeightBeanListToStrArray( - List> weightList) { + List> weightList) { List data = new ArrayList<>(); weightList.forEach(weight -> { @@ -48,19 +49,27 @@ public class AssistantTemplateController extends BaseController { * @param detailList 数据库数据 * @return 页面约定的权重列表 */ - protected List convertEvaluationTemplateWeightList( + protected List> convertEvaluationTemplateWeightList( List detailList) { - List list = new ArrayList<>(); - detailList.forEach(detail -> { - MetricMapperWeightBean weightBean = new MetricMapperWeightBean(); - weightBean.setRowNum(detail.getRowNum()); - weightBean.setValue(detail.getWeight()); - weightBean.setRowId(detail.getFromIndicatorId()); - weightBean.setColId(detail.getToIndicatorId()); - weightBean.setParentId(detail.getIndicatorParentId()); - list.add(weightBean); + List> finalList = new ArrayList<>(); + Map> groupByFromIndicatorMap = detailList.stream() + .collect(Collectors.groupingBy(EvaluationTemplateWeight::getFromIndicatorId)); + + groupByFromIndicatorMap.forEach((key, value) -> { + List list = new ArrayList<>(); + finalList.add(list); + value.forEach(detail -> { + PageMetricMapperWeightBean weightBean = new PageMetricMapperWeightBean(); + weightBean.setRowNum(detail.getRowNum()); + weightBean.setValue(detail.getWeight()); + weightBean.setRowId(detail.getFromIndicatorId()); + weightBean.setColId(detail.getToIndicatorId()); + weightBean.setParentId(detail.getIndicatorParentId()); + list.add(weightBean); + }); }); - return list; + + return finalList; } /** @@ -69,15 +78,15 @@ public class AssistantTemplateController extends BaseController { * @param children 子指标 * @return 表格头信息 */ - protected Map createTableHeaderMap(List children) { - List headerBeans = new ArrayList<>(); + protected Map createTableHeaderMap(List children) { + List headerBeans = new ArrayList<>(); children.forEach(a -> { - MetricTableHeaderBean bean = new MetricTableHeaderBean(); + PageMetricTableHeaderBean bean = new PageMetricTableHeaderBean(); bean.setId(a.getId()); bean.setName(a.getName()); headerBeans.add(bean); }); - Map headerMap = new LinkedHashMap<>(); + Map headerMap = new LinkedHashMap<>(); headerBeans.forEach(header -> { headerMap.put(header.getId(), header); }); @@ -92,11 +101,11 @@ public class AssistantTemplateController extends BaseController { * @param i 行号 * @return 默认映射列表 */ - protected List createEmptyMapperList(Integer parentIndicatorId, + protected List createEmptyMapperList(Integer parentIndicatorId, List children, int i) { - List innerList = new ArrayList<>(); + List innerList = new ArrayList<>(); for (Indicator child : children) { - MetricMapperWeightBean weightBean = new MetricMapperWeightBean(); + PageMetricMapperWeightBean weightBean = new PageMetricMapperWeightBean(); //行ID weightBean.setRowId(children.get(i).getId()); //列Id @@ -119,8 +128,8 @@ public class AssistantTemplateController extends BaseController { * @param indicatePid 父节点指标 * @return 动态表 */ - protected DynamicTable createNewDynamicFromDatabase(Integer indicatePid) { - DynamicTable dynamicTable = new DynamicTable(); + protected pageDynamicTable createNewDynamicFromDatabase(Integer indicatePid) { + pageDynamicTable dynamicTable = new pageDynamicTable(); //查询当前指标的子指标 IndicatorService indicatorService = SpringContextHolder.getBean(IndicatorServiceImpl.class); List children = indicatorService.queryChildren(indicatePid); @@ -129,9 +138,9 @@ public class AssistantTemplateController extends BaseController { dynamicTable.setHeaderMap(createTableHeaderMap(children)); //设置权重信息 - List> weight = new ArrayList<>(); + List> weight = new ArrayList<>(); for (int i = 0; i < children.size(); i++) { - List innerList = createEmptyMapperList(indicatePid, children, i + List innerList = createEmptyMapperList(indicatePid, children, i ); weight.add(innerList); } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationCsvDataController.java b/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationCsvDataController.java deleted file mode 100644 index 4d316ff..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationCsvDataController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hshh.evaluation.controller; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.stereotype.Controller; - -/** - *

- * 前端控制器 - *

- * - * @author liDongYu - * @since 2025-08-21 - */ -@Controller -@RequestMapping("/evaluation/evaluationCsvData") -public class EvaluationCsvDataController { - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationHistoryController.java b/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationHistoryController.java deleted file mode 100644 index 57c309f..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationHistoryController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hshh.evaluation.controller; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.stereotype.Controller; - -/** - *

- * 评估记录表 前端控制器 - *

- * - * @author liDongYu - * @since 2025-08-21 - */ -@Controller -@RequestMapping("/evaluation/evaluationHistory") -public class EvaluationHistoryController { - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationProjectController.java b/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationProjectController.java index 0d9f851..fe54d54 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationProjectController.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationProjectController.java @@ -1,25 +1,42 @@ package com.hshh.evaluation.controller; -import com.hshh.evaluation.bean.EvaluationRequest; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.hshh.evaluation.bean.CsvUploadBean; +import com.hshh.evaluation.bean.PageEvaluationRequest; +import com.hshh.evaluation.bean.ReportBean; +import com.hshh.evaluation.entity.EvaluationCsvData; +import com.hshh.evaluation.entity.EvaluationHistory; +import com.hshh.evaluation.entity.EvaluationIndicatorResult; import com.hshh.evaluation.entity.EvaluationProject; +import com.hshh.evaluation.entity.EvaluationRootResult; import com.hshh.evaluation.entity.EvaluationTemplate; +import com.hshh.evaluation.service.EvaluationCsvDataService; +import com.hshh.evaluation.service.EvaluationHistoryService; +import com.hshh.evaluation.service.EvaluationIndicatorResultService; import com.hshh.evaluation.service.EvaluationProjectService; +import com.hshh.evaluation.service.EvaluationRootResultService; import com.hshh.evaluation.service.EvaluationTemplateService; import com.hshh.indicator.entity.Indicator; +import com.hshh.indicator.entity.IndicatorTopLevel; import com.hshh.indicator.service.IndicatorService; +import com.hshh.indicator.service.IndicatorTopLevelService; import com.hshh.model.entity.FormValue; import com.hshh.model.service.FormFieldConfigService; import com.hshh.model.service.FormValueService; +import com.hshh.system.annotation.LogOperation; import com.hshh.system.base.entity.TableRelations; import com.hshh.system.base.service.TableRelationsService; -import com.hshh.system.common.bean.BaseController; import com.hshh.system.common.bean.OperateResult; import com.hshh.system.common.bean.PaginationBean; import com.hshh.system.common.enums.ErrorCode; import com.hshh.system.common.enums.ErrorMessage; import io.swagger.v3.oas.annotations.Operation; +import java.io.IOException; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; @@ -28,11 +45,14 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; 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.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; /** * 评估工程. @@ -42,7 +62,7 @@ import org.springframework.web.bind.annotation.ResponseBody; */ @Controller @RequestMapping("/evaluation/project") -public class EvaluationProjectController extends BaseController { +public class EvaluationProjectController extends AssistantEvaluationProjectController { @Resource private EvaluationProjectService evaluationProjectService; @@ -76,6 +96,28 @@ public class EvaluationProjectController extends BaseController { private IndicatorService indicatorService; + /** + * 上传的csv文件数据记录服务类. + */ + @Resource + private EvaluationCsvDataService evaluationCsvDataService; + + /** + * 评估历史服务类. + */ + @Resource + private EvaluationHistoryService evaluationHistoryService; + + /** + * 根指标评估历史记录服务类. + */ + @Resource + private EvaluationRootResultService rootResultService; + @Resource + private IndicatorTopLevelService topLevelService; + @Resource + private EvaluationIndicatorResultService evaluationIndicatorResultService; + /** * 默认页. * @@ -114,6 +156,7 @@ public class EvaluationProjectController extends BaseController { */ @ResponseBody @PostMapping("/save") + @LogOperation("保存评估工程") public OperateResult save(@Valid @RequestBody EvaluationProject project, BindingResult bindingResult) { if (bindingResult.hasErrors()) { @@ -146,6 +189,7 @@ public class EvaluationProjectController extends BaseController { */ @ResponseBody @GetMapping("/remove/{id}") + @LogOperation("删除工程") public OperateResult remove(@PathVariable("id") Integer id) { List reList = tableRelationsService.queryRel(id, "m_data_evaluation_project"); if (!reList.isEmpty()) { @@ -159,14 +203,14 @@ public class EvaluationProjectController extends BaseController { /** * 选择数据源类型. * - * @param projectId 工程ID - * @param model session容器 + * @param params 请求参数 + * @param model session容器 * @return project/datasource_select.html */ @GetMapping("/selectDatasourceType") - public String selectDatasourceType(Integer projectId, String randomKey, Model model) { - model.addAttribute("projectId", projectId); - model.addAttribute("randomKey", randomKey); + public String selectDatasourceType(@RequestParam Map params, Model model) { + setAttribute(model, params); + return "project/datasource_select"; } @@ -178,19 +222,27 @@ public class EvaluationProjectController extends BaseController { * @return project/datasource_db.html */ @GetMapping("/database") - public String databasePage(PaginationBean request, Model model) { - //获取工程 + public String databasePage(PaginationBean request, Model model, + @RequestParam Map params) { //获取基础设施ID - Long modelId = evaluationProjectService.selectModelIdByProjectId(request.getId()); + Long modelId = evaluationProjectService.selectModelIdByProjectId( + params.get("projectId") == null ? 0 : Integer.parseInt(params.get("projectId"))); + if (modelId == null) { + throw new RuntimeException("没有设置基础设施"); + } + params.put("modelId", modelId.toString()); + //设置数据源页面中的隐藏属性 - addDatasourceModelAttribute(modelId, request, model); + addDatasourceModelAttribute(request, model, params); + //获取表头 Map headerMap = formFieldConfigService.getHeaderMap(modelId.intValue()); model.addAttribute("headerMap", headerMap); //查询数据 //替换为modelId查询 - request.setId(modelId.intValue()); + request.setBusinessKey(modelId.intValue()); + List formDataList = formValueService.list(request); List> listMap = new ArrayList<>(); formDataList.forEach(formData -> { @@ -203,17 +255,41 @@ public class EvaluationProjectController extends BaseController { return "project/datasource_db"; } - private void addDatasourceModelAttribute(Long modelId, PaginationBean request, Model model) { - EvaluationProject project = evaluationProjectService.getById(request.getId()); + private void addDatasourceModelAttribute(PaginationBean request, Model model, + @RequestParam Map params) { + EvaluationProject project = evaluationProjectService.getById( + params.get("projectId") == null ? 0 : Integer.parseInt(params.get("projectId"))); if (project != null) { model.addAttribute("templateId", project.getTemplateId()); + params.put("templateId", project.getTemplateId() + ""); } - //缓存modelId,projectId - model.addAttribute("modelId", modelId); - model.addAttribute("projectId", request.getId()); - model.addAttribute("search", request.getSearch()); - model.addAttribute("randomKey", request.getRandomKey()); - model.addAttribute("method", request.getMethod()); + setAttribute(model, params); + + } + + private void setAttribute(Model model, @RequestParam Map params) { + if (params.get("projectId") != null) { + model.addAttribute("projectId", params.get("projectId")); + } + if (params.get("templateId") != null) { + model.addAttribute("templateId", params.get("templateId")); + } + if (params.get("method") != null) { + model.addAttribute("method", params.get("method")); + } + if (params.get("search") != null) { + model.addAttribute("search", params.get("search")); + } + if (params.get("randomKey") != null) { + model.addAttribute("randomKey", params.get("randomKey")); + } + if (params.get("modelId") != null) { + model.addAttribute("modelId", params.get("modelId")); + } + if (params.get("membership") != null) { + model.addAttribute("membership", params.get("membership")); + } + } /** @@ -223,11 +299,70 @@ public class EvaluationProjectController extends BaseController { * @param model session容器 * @return project/datasource_csv.html */ + @GetMapping("/csv") - public String csvPage(PaginationBean request, Model model) { + public String csvPage(PaginationBean request, Model model, + @RequestParam Map params) { + + if (params.get("projectId") != null && params.get("templateId") == null) { + EvaluationProject project = evaluationProjectService.getById( + Integer.parseInt(params.get("projectId"))); + if (project != null) { + model.addAttribute("templateId", project.getTemplateId()); + } + } + + setAttribute(model, params); + + //分页查询randomKey + List list = evaluationCsvDataService.list(request); + if (!list.isEmpty()) { + //取出csvHeader + JSONArray first = JSON.parseArray(list.get(0).getCsvHeader()); + + Map headerMap = new LinkedHashMap<>(); + first.forEach(item -> { + headerMap.put(item.toString(), item.toString()); + }); + + model.addAttribute("headerMap", headerMap); + List> listMap = new ArrayList<>(); + list.forEach(formData -> { + + listMap.add(formData.toMap()); //转为map对象放入listMap中 + }); + Long total = evaluationCsvDataService.count(request); + setPaginationInfo(request, listMap, total, model); + } + return "project/datasource_csv"; } + /** + * 上传csv文件. + * + * @param uploadInfo 上传的信息 + * @return project/datasource_csv.html + */ + + @PostMapping("/uploadCsv") + public String uploadCsv(@ModelAttribute CsvUploadBean uploadInfo, + RedirectAttributes ra, @RequestParam Map params) throws IOException { + + //上传文件信息放入数据库 + evaluationProjectService.uploadCsv(uploadInfo); + + //设置工程ID + ra.addAttribute("id", uploadInfo.getProjectId()); + ra.addAttribute("search", uploadInfo.getSearch()); + ra.addAttribute("randomKey", uploadInfo.getRandomKey()); + ra.addAttribute("method", uploadInfo.getMethod()); + for (Map.Entry entry : params.entrySet()) { + ra.addAttribute(entry.getKey(), entry.getValue()); + } + return "redirect:/evaluation/project/csv"; + } + /** * 导航的数据评估执行页面. * @@ -235,21 +370,21 @@ public class EvaluationProjectController extends BaseController { * @param model session容器 * @return 评估处理页面 */ + @LogOperation("评估执行页面") @PostMapping("/processEvaluation") - public String processEvaluationPage(@RequestBody EvaluationRequest request, Model model) { + public String processEvaluationPage(@RequestBody PageEvaluationRequest request, Model model) { addProcessEvaluationModelAttribute(request, model); return "project/project_evaluation_process"; } - private void addProcessEvaluationModelAttribute(EvaluationRequest request, Model model) { + private void addProcessEvaluationModelAttribute(PageEvaluationRequest request, Model model) { //获取工程名称 EvaluationProject project = evaluationProjectService.getById(request.getProjectId()); if (project != null) { model.addAttribute("projectName", project.getProjectName()); } - Indicator indicator = indicatorService.selectByTemplateId( - request.getTemplateId()); + Indicator indicator = indicatorService.selectByTemplateId(request.getTemplateId()); //获取指标名称 if (indicator != null) { model.addAttribute("indicatorName", indicator.getName()); @@ -258,4 +393,114 @@ public class EvaluationProjectController extends BaseController { model.addAttribute("datasourceName", (request.getDatasourceType().equals("database") ? "数据库" : "CSV文件")); } + + /** + * 查看根指标评估历史. + * + * @param projectId 工程ID + * @return project/evaluation_root_history.html + */ + @GetMapping("/root_history") + public String rootHistory(Integer projectId) { + EvaluationHistory recentHistory = evaluationHistoryService.queryRecentByProjectId(projectId); + if (recentHistory == null) { + throw new RuntimeException("请先开始评估"); + } + String randomKey = recentHistory.getRandomKey(); + // 重定向到另一个接口,带上参数 + return "redirect:root_history_by_randomKey?randomKey=" + randomKey + "&projectId=" + projectId; + } + + @GetMapping("/root_history_by_randomKey") + public String rootHistoryByRandomKey(String randomKey, Integer projectId, Model model) { + List rootList = rootResultService.queryListByRandomKey( + randomKey); + model.addAttribute("projectId", projectId); + model.addAttribute("rootList", rootList); + return "project/evaluation_root_history"; + } + + /** + * 查看报告. + * + * @param id 根历史记录ID + */ + @GetMapping("/reportData") + @ResponseBody + @LogOperation("查看报告") + public OperateResult report(Integer id) { + final ReportBean reportBean = new ReportBean(); + //设置摘要信息 + EvaluationRootResult rootResult = rootResultService.getById(id); + reportBean.setResult(rootResult); + //规范化时间 + rootResult.setCreateTimeStr( + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(rootResult.getCreateTime())); + + //获取底层指标数量 + int bottomNum = indicatorService.selectNoChildByTopId(rootResult.getIndicatorTopId()).size(); + reportBean.setBottomNum(bottomNum); + + //设置所在评价集区间名称 + List levelList = topLevelService.getTopLevel(rootResult.getIndicatorTopId()); + levelList.sort((a, b) -> Double.compare(Double.parseDouble(b.getGrade()), + Double.parseDouble(a.getGrade()))); + setLevelName(levelList, rootResult); + reportBean.setLevelList(levelList); + + //各维度得分对比 + String membership = rootResult.getMembershipScore(); + Map membershipMap = membershipScoreMap(membership); + StringBuilder replaceMemberShipBuilder = new StringBuilder(); + levelList.forEach(level -> { + if (membershipMap.get(level.getLevelName()) != null) { + replaceMemberShipBuilder.append(level.getLevelName()).append(":") + .append(membershipMap.get(level.getLevelName())).append(";"); + level.setActualValue( + Double.parseDouble(level.getGrade()) * membershipMap.get(level.getLevelName())); + } + }); + //按照优先级重新覆盖隶属函数对应的值 + rootResult.setMembershipScore(replaceMemberShipBuilder.toString()); + //设置指标表格 + List indicatorResultList = evaluationIndicatorResultService.selectByRootId( + id); + reportBean.setDataNodeList( + covertIndicatorResultToReportIndicatorNodeData(indicatorResultList, levelList)); + + //设置优和良综合 + reportBean.setHighRate(highRate(membershipMap)); + //设置隶属度pie数据 + reportBean.setPieDataList(pieDataList(membershipMap)); + //查询一级指标的名称和得分 + List firstLevelList = evaluationIndicatorResultService.queryListByParentIdAndRandomKey( + rootResult.getIndicatorTopId(), + + rootResult.getRandomKey(), rootResult.getId()); + + //设置柱状图数据 + reportBean.setBarDataList(covertIndicatorResultToBarData(firstLevelList)); + return OperateResult.success(reportBean); + } + + /** + * 导航到报告页面. + */ + @GetMapping("/report") + public String reportPage() { + return "project/evaluation_report"; + } + + /** + * 导航到历史页面. + */ + @GetMapping("/history") + public String history(Integer projectId, Model model) { + List list = evaluationHistoryService.queryListByProjectId( + projectId); + model.addAttribute("list", list); + return "project/evaluation_history"; + } + + } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationResultController.java b/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationResultController.java deleted file mode 100644 index feae150..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationResultController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hshh.evaluation.controller; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.stereotype.Controller; - -/** - *

- * 评估结果表 前端控制器 - *

- * - * @author liDongYu - * @since 2025-08-21 - */ -@Controller -@RequestMapping("/evaluation/evaluationResult") -public class EvaluationResultController { - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationTemplateController.java b/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationTemplateController.java index b4e6a64..b665531 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationTemplateController.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationTemplateController.java @@ -1,10 +1,8 @@ package com.hshh.evaluation.controller; -import com.hshh.evaluation.bean.DynamicTable; -import com.hshh.evaluation.bean.MetricComputeRequest; -import com.hshh.evaluation.bean.MetricComputerResponse; -import com.hshh.evaluation.bean.MetricMapperWeightBean; -import com.hshh.evaluation.bean.MetricTableHeaderBean; +import com.hshh.evaluation.bean.PageMetricComputeRequest; +import com.hshh.evaluation.bean.PageMetricComputerResponse; +import com.hshh.evaluation.bean.PageMetricMapperWeightBean; import com.hshh.evaluation.entity.EvaluationTemplate; import com.hshh.evaluation.entity.EvaluationTemplateWeight; import com.hshh.evaluation.service.EvaluationTemplateIndicatorWeightService; @@ -12,11 +10,12 @@ import com.hshh.evaluation.service.EvaluationTemplateService; import com.hshh.evaluation.service.EvaluationTemplateWeightService; import com.hshh.indicator.entity.Indicator; import com.hshh.indicator.service.IndicatorService; +import com.hshh.system.annotation.LogOperation; import com.hshh.system.base.entity.TableRelations; import com.hshh.system.base.service.TableRelationsService; -import com.hshh.system.common.Strings.StringOperationUtil; -import com.hshh.system.common.algorithm.AhpNode; -import com.hshh.system.common.algorithm.AhpTreeCompute; +import com.hshh.system.common.Strings.StringUtil; +import com.hshh.system.algorithm.ahp.AhpNode; +import com.hshh.system.algorithm.ahp.AhpTreeCompute; import com.hshh.system.common.bean.JsTree; import com.hshh.system.common.bean.OperateResult; import com.hshh.system.common.bean.PaginationBean; @@ -25,7 +24,6 @@ import com.hshh.system.common.enums.ErrorMessage; import io.swagger.v3.oas.annotations.Operation; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; @@ -122,6 +120,7 @@ public class EvaluationTemplateController extends AssistantTemplateController { */ @ResponseBody @PostMapping("/save") + @LogOperation("保存模板") public OperateResult save(@Valid @RequestBody EvaluationTemplate evaluationTemplate, BindingResult bindingResult) { if (bindingResult.hasErrors()) { @@ -141,29 +140,19 @@ public class EvaluationTemplateController extends AssistantTemplateController { evaluationTemplate.setCreateTime(LocalDateTime.now()); } - -// //1.合并权重数据 -// Map unitWeightDataMap = unitWeightMap(evaluationTemplate); -// -// //2.填充数据;如果一个指标下面只有一个孩子,则默认填充为1 -// List lonelyChild = indicatorService.queryLonelyChild( -// evaluationTemplate.getIndicatorTopId()); -// -// paddingDefaultValueWhenParentHasOnlyLonelyChild(lonelyChild, unitWeightDataMap); - -// //4. 提交 -// evaluationTemplateService.saveWhole(evaluationTemplate, unitWeightDataMap); + evaluationTemplateService.saveWhole(evaluationTemplate); return OperateResult.success(); } /** - * 根据id删除指标. + * 根据id删除模板. * * @param id 要删除的ID * @return 操作结果 */ @GetMapping("/remove/{id}") @ResponseBody + @LogOperation("删除模板") public OperateResult remove(@PathVariable("id") Integer id) { List reledList = tableRelationsService.queryRel(id, "m_data_evaluation_template"); @@ -206,8 +195,9 @@ public class EvaluationTemplateController extends AssistantTemplateController { return OperateResult.success(new ArrayList<>()); } //查询指标权重树 - Map weightMap = evaluationTemplateIndicatorWeightService.getEvaluationTemplateIndicatorWeightMap( + Map weightMap = evaluationTemplateIndicatorWeightService.getEvaluationTemplateIndicatorWeightMap( id, templateId); + //获取互比信息 Map> weightDetailMap = evaluationTemplateDetailWeightService.groupByParentIndicatorId( id, templateId); List jsTreeList = indicatorService.metricTree(id); @@ -216,20 +206,22 @@ public class EvaluationTemplateController extends AssistantTemplateController { return OperateResult.success(jsTreeList); } - private void setWeightToTree(List jsTreeList, Map weightMap, + private void setWeightToTree(List jsTreeList, Map weightMap, Map> weightDetailMap) { if (jsTreeList == null) { return; } jsTreeList.forEach(tree -> { if (weightMap.containsKey((int) tree.getOriginalId())) { - tree.getData().put("weight", weightMap.get((int) tree.getOriginalId())); + tree.getData().put("weight", weightMap.get((int) tree.getOriginalId())); + tree.setText(tree.getText() + "(" + weightMap.get((int) tree.getOriginalId()) + ")"); } else { + tree.setText(tree.getText() + "(1)"); tree.getData().put("weight", 1); } if (weightDetailMap.containsKey((int) tree.getOriginalId())) { - tree.getData().put("weightDetail", + tree.getData().put("children", convertEvaluationTemplateWeightList(weightDetailMap.get((int) tree.getOriginalId()))); } setWeightToTree(tree.getChildren(), weightMap, weightDetailMap); @@ -237,8 +229,6 @@ public class EvaluationTemplateController extends AssistantTemplateController { } - - /** * 获取指标编辑/新增时的table表格. * @@ -262,13 +252,13 @@ public class EvaluationTemplateController extends AssistantTemplateController { */ @PostMapping("/computer") @ResponseBody - public synchronized OperateResult> computerWeight( - @RequestBody MetricComputeRequest requests) { + public synchronized OperateResult> computerWeight( + @RequestBody PageMetricComputeRequest requests) { //如果没有值,直接静默返回 if (requests.getWeightList() == null || requests.getWeightList().isEmpty()) { return OperateResult.success(); } - final List responseList = new ArrayList<>(); + final List responseList = new ArrayList<>(); List metricList = requests.getMetric(); final AhpNode H = new AhpNode("H"); @@ -276,15 +266,15 @@ public class EvaluationTemplateController extends AssistantTemplateController { AhpNode m = new AhpNode(metric); H.add(m); }); - List> weightList = requests.getWeightList(); + List> weightList = requests.getWeightList(); - double[][] data = StringOperationUtil.toDoubleArray( + double[][] data = StringUtil.toDoubleArray( convertMetricMapperWeightBeanListToStrArray(weightList)); H.setLocalMatrix(data); H.globalWeight = 1; // 根节点全局权重=1 AhpTreeCompute.computeTree(H); H.children.forEach(child -> { - MetricComputerResponse response = new MetricComputerResponse(); + PageMetricComputerResponse response = new PageMetricComputerResponse(); response.setId(child.name); response.setWeight(String.format("%.4f", child.globalWeight)); responseList.add(response); diff --git a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationTemplateIndicatorWeightController.java b/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationTemplateIndicatorWeightController.java deleted file mode 100644 index 67242c4..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/controller/EvaluationTemplateIndicatorWeightController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hshh.evaluation.controller; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.stereotype.Controller; - -/** - *

- * 前端控制器 - *

- * - * @author liDongYu - * @since 2025-08-21 - */ -@Controller -@RequestMapping("/evaluation/evaluationTemplateIndicatorWeight") -public class EvaluationTemplateIndicatorWeightController { - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationCsvData.java b/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationCsvData.java index f098e63..a529ab8 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationCsvData.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationCsvData.java @@ -1,10 +1,14 @@ package com.hshh.evaluation.entity; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.io.Serializable; +import com.hshh.system.common.bean.BaseBean; import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; import lombok.Data; /** @@ -15,7 +19,7 @@ import lombok.Data; */ @TableName("m_data_evaluation_csv_data") @Data -public class EvaluationCsvData implements Serializable { +public class EvaluationCsvData extends BaseBean { private static final long serialVersionUID = 1L; @@ -36,5 +40,15 @@ public class EvaluationCsvData implements Serializable { private Integer userId; + public Map toMap() { + Map map = new HashMap<>(); + map.put("id", id); + map.put("seq", getSeq()); + JSONObject jsonObj = JSON.parseObject(rawData, JSONObject.class); + map.putAll(jsonObj); + return map; + } + + private String csvHeader; } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationHistory.java b/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationHistory.java index 076a73d..0cff13c 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationHistory.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationHistory.java @@ -32,4 +32,8 @@ public class EvaluationHistory implements Serializable { private Integer userId; private String randomKey; + private String datasourceType; + private String membershipFunc; + private String fuzzyOperator; + } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationResult.java b/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationResult.java deleted file mode 100644 index b3045f0..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationResult.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.hshh.evaluation.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import java.io.Serializable; -import java.time.LocalDateTime; -import lombok.Data; - -/** - * 评估结果表. - * - * @author liDongYu - * @since 2025-08-21 - */ -@TableName("m_data_evaluation_result") -@Data -public class EvaluationResult implements Serializable { - - private static final long serialVersionUID = 1L; - - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - - private Integer historyId; - - - private Integer projectId; - - - private String rawData; - - - private String resultData; - - - private LocalDateTime createTime; - private String randomKey; - /** - * 得分. - */ - private Double finalScore; - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationTemplate.java b/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationTemplate.java index eabe1da..f517426 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationTemplate.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/entity/EvaluationTemplate.java @@ -4,7 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.hshh.evaluation.bean.MetricMapperWeightBean; +import com.hshh.evaluation.bean.PageIndicatorWeight; +import com.hshh.evaluation.bean.PageMetricMapperWeightBean; import com.hshh.system.common.bean.BaseBean; import java.time.LocalDateTime; import java.util.List; @@ -47,12 +48,16 @@ public class EvaluationTemplate extends BaseBean { private String indicatorTopName; @TableField(exist = false) private String templateStatusName; - //提交时,当前页面对应的指标id,其余指标从缓存取 - @TableField(exist = false) - private List> currentPagePartData; - //暂存指标权重的key - @TableField(exist = false) - private String draftKey; + /** + * 前端传递的各个指标的权重. + */ + @TableField(exist = false) + private List indicatorWeightList; + /** + * 前端传递的各个指标之间对比权重信息. + */ + @TableField(exist = false) + private List templateDetailWeightList; } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationCsvDataMapper.java b/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationCsvDataMapper.java index ba5abe9..427ba7d 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationCsvDataMapper.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationCsvDataMapper.java @@ -1,16 +1,40 @@ package com.hshh.evaluation.mapper; -import com.hshh.evaluation.entity.EvaluationCsvData; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hshh.evaluation.entity.EvaluationCsvData; +import com.hshh.system.common.bean.PaginationBean; +import java.util.List; +import org.apache.ibatis.annotations.Param; /** - *

- * Mapper 接口 - *

+ * 上传的评估数据csv原始数据记录. * * @author liDongYu * @since 2025-08-21 */ public interface EvaluationCsvDataMapper extends BaseMapper { + /** + * 列表信息. + * + * @param paginationBean 请求参数 + * @return 结果列表 + */ + List list(PaginationBean paginationBean); + + /** + * 总条数. + * + * @param paginationBean 请求参数 + * @return 总条目 + */ + Long count(PaginationBean paginationBean); + + /** + * 根据id集合查找记录. + * + * @param ids id集合 + * @return 结果列表 + */ + List selectByIds(@Param("ids") List ids); } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationHistoryMapper.java b/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationHistoryMapper.java index 462b00b..bfdf292 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationHistoryMapper.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationHistoryMapper.java @@ -1,7 +1,8 @@ package com.hshh.evaluation.mapper; -import com.hshh.evaluation.entity.EvaluationHistory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hshh.evaluation.entity.EvaluationHistory; +import java.util.List; /** *

@@ -13,4 +14,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface EvaluationHistoryMapper extends BaseMapper { + /** + * 根据项目查询最新的历史记录. + * + * @param projectId 工程ID + * @return 最新的历史记录 + */ + List queryRecentByProjectId(Integer projectId); } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationResultMapper.java b/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationResultMapper.java deleted file mode 100644 index 007d850..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/mapper/EvaluationResultMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.hshh.evaluation.mapper; - -import com.hshh.evaluation.entity.EvaluationResult; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 评估结果表 Mapper 接口 - *

- * - * @author liDongYu - * @since 2025-08-21 - */ -public interface EvaluationResultMapper extends BaseMapper { - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/CoreEvaluationService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/CoreEvaluationService.java new file mode 100644 index 0000000..305a0d8 --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/CoreEvaluationService.java @@ -0,0 +1,21 @@ +package com.hshh.evaluation.service; + +import com.hshh.evaluation.bean.PageEvaluationRequest; + + +/** + * 核心评估服务. + * + * @author LiDongYU + * @since 2025/7/22 + */ +public interface CoreEvaluationService { + + /** + * 核心评估算法. + * + * @param request 评估请求 + * @param userId 用户 ID + */ + void evaluation(PageEvaluationRequest request, Integer userId); +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationCsvDataService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationCsvDataService.java new file mode 100644 index 0000000..2d91290 --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationCsvDataService.java @@ -0,0 +1,50 @@ +package com.hshh.evaluation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.hshh.evaluation.bean.CsvUploadBean; +import com.hshh.evaluation.entity.EvaluationCsvData; +import com.hshh.system.common.bean.PaginationBean; +import java.util.List; +import java.util.Map; +import org.apache.ibatis.annotations.Param; + +/** + * 保存每次评估时上传的csv数据. + * + * @author liDongYu + * @since 2025-08-21 + */ +public interface EvaluationCsvDataService extends IService { + + /** + * 保存用户上传的csv文件记录. + * + * @param dataList csv解析后的数据 + * @param uploadInfo 附加表单信息 + */ + void saveWhole(List> dataList, CsvUploadBean uploadInfo); + + /** + * 列表信息. + * + * @param paginationBean 请求参数 + * @return 结果列表 + */ + List list(PaginationBean paginationBean); + + /** + * 总条数. + * + * @param paginationBean 请求参数 + * @return 总条目 + */ + Long count(PaginationBean paginationBean); + + /** + * 根据id集合查找记录. + * + * @param ids id集合 + * @return 结果列表 + */ + List selectByIds(@Param("ids") List ids); +} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationHistoryService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationHistoryService.java index 1497da4..aff81f3 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationHistoryService.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationHistoryService.java @@ -1,7 +1,9 @@ package com.hshh.evaluation.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.hshh.evaluation.bean.PageEvaluationRequest; import com.hshh.evaluation.entity.EvaluationHistory; +import java.util.List; /** * 评估记录表 服务类. @@ -11,4 +13,26 @@ import com.hshh.evaluation.entity.EvaluationHistory; */ public interface EvaluationHistoryService extends IService { + /** + * 保存评估历史. + * + * @param request 评估请求 + */ + void saveWhole(PageEvaluationRequest request); + + /** + * 根据项目查询最新的历史记录. + * + * @param projectId 工程ID + * @return 最新的历史记录 + */ + EvaluationHistory queryRecentByProjectId(Integer projectId); + + /** + * 查询工程评估的历史记录. + * + * @param projectId 工程ID + * @return 历史记录 + */ + List queryListByProjectId(Integer projectId); } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationProjectService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationProjectService.java index b259ee9..7571ab3 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationProjectService.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationProjectService.java @@ -1,9 +1,11 @@ package com.hshh.evaluation.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.hshh.evaluation.bean.EvaluationRequest; +import com.hshh.evaluation.bean.CsvUploadBean; +import com.hshh.evaluation.bean.PageEvaluationRequest; import com.hshh.evaluation.entity.EvaluationProject; import com.hshh.system.common.bean.PaginationBean; +import java.io.IOException; import java.util.List; /** @@ -59,5 +61,12 @@ public interface EvaluationProjectService extends IService { * @param request 评估请求 * @param userId 用户ID */ - void evaluate(EvaluationRequest request, Integer userId); + void evaluate(PageEvaluationRequest request, Integer userId); + + /** + * 上传csv文件. + * + * @param uploadInfo csv文件信息 + */ + void uploadCsv(CsvUploadBean uploadInfo) throws IOException; } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationResultService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationResultService.java deleted file mode 100644 index 910d3c5..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationResultService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.hshh.evaluation.service; - -import com.hshh.evaluation.entity.EvaluationResult; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 评估结果表 服务类 - *

- * - * @author liDongYu - * @since 2025-08-21 - */ -public interface EvaluationResultService extends IService { - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateIndicatorWeightService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateIndicatorWeightService.java index 6480f46..078065f 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateIndicatorWeightService.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateIndicatorWeightService.java @@ -2,6 +2,7 @@ package com.hshh.evaluation.service; import com.baomidou.mybatisplus.extension.service.IService; import com.hshh.evaluation.entity.EvaluationTemplateIndicatorWeight; +import java.util.List; import java.util.Map; /** @@ -17,9 +18,27 @@ public interface EvaluationTemplateIndicatorWeightService extends * 获取指标对应的权重. * * @param indicatorTopId 指标ID - * @param templateId 模板 ID + * @param templateId 模板 ID * @return 权重信息 */ - public Map getEvaluationTemplateIndicatorWeightMap(Integer indicatorTopId, + Map getEvaluationTemplateIndicatorWeightMap(Integer indicatorTopId, Integer templateId); + + /** + * 保存指标权重信息. + * + * @param templateId 模板ID + * @param indicatorTopId 顶级指标ID + * @param list 指标权重集合 + */ + void saveEvaluationTemplateIndicatorWeight(Integer templateId, Integer indicatorTopId, + List list); + + /** + * 删除指标权重信息. + * + * @param templateId 模板 ID + * @param indicatorTopId 顶级指标ID + */ + void deleteByTemplateIdAndIndicatorTopId(Integer templateId, Integer indicatorTopId); } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateService.java index b2799ce..e22a460 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateService.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateService.java @@ -34,10 +34,10 @@ public interface EvaluationTemplateService extends IService * 保存评估模板数据. * * @param evaluationTemplate 评估模板 - * @param weightData 权重 + */ - void saveWhole(EvaluationTemplate evaluationTemplate, - Map weightData); + void saveWhole(EvaluationTemplate evaluationTemplate + ); /** * 根据名称查询列表. diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateWeightService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateWeightService.java index b683b07..5c8f22d 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateWeightService.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/EvaluationTemplateWeightService.java @@ -14,24 +14,6 @@ import java.util.Map; public interface EvaluationTemplateWeightService extends IService { - /** - * 根据模板id+指标id删除. - * - * @param templateId 模板ID - * @param indicatorTopId 顶级指标ID - * @param parentId 上级指标ID - */ - void deleteEvaluationTemplateWeightWithTemplateIdAndIndicatorId(Integer templateId, - Integer indicatorTopId, - Integer parentId); - - /** - * 根据模板ID删除权重信息. - * - * @param templateId 模板ID - */ - void deleteEvaluationTemplateWeightWithTemplateId(Integer templateId); - /** * 根据指标父ID和模板id获取权重列表. * @@ -42,6 +24,16 @@ public interface EvaluationTemplateWeightService extends IService queryListByIndicatorParentIdAndTemplateId( Integer indicatorParentId, Integer templateId); + /** + * 根据顶级ID和模板id获取权重列表. + * + * @param indicatorTopId 指标顶级ID + * @param templateId 模板ID + * @return 权重列表 + */ + List queryListByIndicatorTopIdAndTemplateId( + Integer indicatorTopId, Integer templateId); + /** * 指标对应的权重详情,按照父指标ID分类. * @@ -51,4 +43,23 @@ public interface EvaluationTemplateWeightService extends IService> groupByParentIndicatorId(Integer indicatorParentId, Integer templateId); + + /** + * 保存指标和指标之间的矩阵信息. + * + * @param templateId 模板ID + * @param indicatorTopId 指标ID + * @param weightList 互比矩阵列表 + */ + void saveIndicatorMatrix(Integer templateId, Integer indicatorTopId, + List weightList); + + /** + * 删除互比信息. + * + * @param templateId 模板ID + * @param indicatorTopId 顶级指标ID + */ + void deleteByTemplateIdAndIndicatorTopId(Integer templateId, Integer indicatorTopId); + } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/IEvaluationCsvDataService.java b/manager-admin/src/main/java/com/hshh/evaluation/service/IEvaluationCsvDataService.java deleted file mode 100644 index bfe7b04..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/IEvaluationCsvDataService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.hshh.evaluation.service; - -import com.hshh.evaluation.entity.EvaluationCsvData; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 服务类 - *

- * - * @author liDongYu - * @since 2025-08-21 - */ -public interface IEvaluationCsvDataService extends IService { - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/CoreEvaluationServiceImpl.java b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/CoreEvaluationServiceImpl.java new file mode 100644 index 0000000..45f7f7a --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/CoreEvaluationServiceImpl.java @@ -0,0 +1,514 @@ +package com.hshh.evaluation.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.hshh.evaluation.bean.PageEvaluationRequest; +import com.hshh.evaluation.bean.SingleEvaluationData; +import com.hshh.evaluation.entity.EvaluationCsvData; +import com.hshh.evaluation.entity.EvaluationTemplate; +import com.hshh.evaluation.service.CoreEvaluationService; +import com.hshh.evaluation.service.EvaluationCsvDataService; +import com.hshh.evaluation.service.EvaluationHistoryService; +import com.hshh.evaluation.service.EvaluationRootResultService; +import com.hshh.evaluation.service.EvaluationTemplateIndicatorWeightService; +import com.hshh.evaluation.service.EvaluationTemplateService; +import com.hshh.indicator.entity.Indicator; +import com.hshh.indicator.entity.IndicatorBottomCsvMapper; +import com.hshh.indicator.entity.IndicatorBottomFormMapper; +import com.hshh.indicator.entity.IndicatorEvalItem; +import com.hshh.indicator.entity.IndicatorTopLevel; +import com.hshh.indicator.entity.IndicatorTopSet; +import com.hshh.indicator.service.IndicatorBottomCsvMapperService; +import com.hshh.indicator.service.IndicatorBottomFormMapperService; +import com.hshh.indicator.service.IndicatorEvalItemService; +import com.hshh.indicator.service.IndicatorService; +import com.hshh.indicator.service.IndicatorTopLevelService; +import com.hshh.indicator.service.IndicatorTopSetService; +import com.hshh.model.entity.FormValue; +import com.hshh.model.service.FormValueService; +import com.hshh.system.algorithm.fuzzy.EvaluationLevel; +import com.hshh.system.algorithm.fuzzy.FuzzyEvaluationService; +import com.hshh.system.algorithm.fuzzy.FuzzyOperator; +import com.hshh.system.algorithm.fuzzy.GlobalEvaluationConfig; +import com.hshh.system.algorithm.fuzzy.GlobalMembershipFunction; +import com.hshh.system.algorithm.fuzzy.GradeRange; +import com.hshh.system.algorithm.fuzzy.IndicatorNode; +import com.hshh.system.algorithm.fuzzy.LeafFullTriangularMembershipFunction; +import com.hshh.system.algorithm.fuzzy.LeafHybridMembershipFunction; +import com.hshh.system.common.bean.PaginationBean; +import com.hshh.system.ws.WsEvaluationServer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 模糊综合评估服务类 (重构后). + * + * @author LiDongYU + * @since 2025/7/22 + */ +@Service +public class CoreEvaluationServiceImpl implements CoreEvaluationService { + + + @Resource + private EvaluationTemplateService evaluationTemplateService; + @Resource + private IndicatorTopSetService indicatorTopSetService; + @Resource + private IndicatorService indicatorService; + @Resource + private IndicatorTopLevelService indicatorTopLevelService; + @Resource + private IndicatorBottomFormMapperService indicatorBottomFormMapperService; + @Resource + private IndicatorBottomCsvMapperService indicatorBottomCsvMapperService; + @Resource + private FormValueService formValueService; + @Resource + private EvaluationCsvDataService evaluationCsvDataService; + @Resource + private EvaluationTemplateIndicatorWeightService evaluationTemplateIndicatorWeightService; + @Resource + private IndicatorEvalItemService indicatorEvalItemService; //底部指标评价集区间 + @Resource + private EvaluationHistoryService evaluationHistoryService; //评估历史批次记录 + @Resource + private EvaluationRootResultService evaluationRootResultService; //评估详情及概况记录 + + // 定义分页大小常量,便于管理 + private static final int DEFAULT_PAGE_SIZE = 100; + + /** + * 评估主入口方法。 通过策略模式分发到不同的数据源处理器. + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void evaluation(PageEvaluationRequest request, Integer userId) { + long now = System.currentTimeMillis(); + try { + + // 1. 获取评估所需的通用前置数据(模板、隶属度、评价集、指标树) + EvaluationTemplate template = getTemplateOrThrow(request.getTemplateId()); + Integer indicatorTopId = template.getIndicatorTopId(); + request.setIndicatorTopId(indicatorTopId); + IndicatorTopSet membershipFuncSet = getMembershipFuncSetOrThrow(indicatorTopId); //隶属函数设置 + List topLevelList = getTopLevelListOrThrow(indicatorTopId); //评价集区间 + Indicator indicator = indicatorService.getIndicator(indicatorTopId); //获取指标 + + Map indicatorWeightMap = evaluationTemplateIndicatorWeightService.getEvaluationTemplateIndicatorWeightMap( + indicatorTopId, template.getId()); //指标权重map + Map> indicatorEvalItemMap = indicatorEvalItemService.getIndicatorEvalItemMapByIndicatorTopId( + indicatorTopId); //底部指标评价范围 + // 2. 根据数据源类型,选择并执行相应的策略 + String dataSourceType = request.getDatasourceType(); + if ("database".equals(dataSourceType)) { + // 获取数据库数据源的特定映射关系 + List mapperList = indicatorBottomFormMapperService.selectIndicatorToFieldNameListByIndicatorTopId( + indicatorTopId); + if (mapperList == null || mapperList.isEmpty()) { + throw new EvaluationException("设施字段和指标没有设置映射关系"); + } + Map mappingMap = mapperList.stream().collect( + Collectors.toMap(IndicatorBottomFormMapper::getIndicatorId, + IndicatorBottomFormMapper::getFiledName)); + + // 创建数据库策略并执行 + DataSourceStrategy dbStrategy = new DatabaseSourceStrategy(formValueService, + FormValue::getModelData); + processEvaluation(request, userId, membershipFuncSet, topLevelList, indicator, mappingMap, + dbStrategy, indicatorWeightMap, indicatorEvalItemMap); + + } else if ("csv".equals(dataSourceType)) { + // 获取CSV数据源的特定映射关系 + List mapperList = indicatorBottomCsvMapperService.selectIndicatorToFieldNameListByIndicatorTopId( + indicatorTopId); + if (mapperList == null || mapperList.isEmpty()) { + throw new EvaluationException("CSV列和指标没有设置映射关系"); + } + Map mappingMap = mapperList.stream().collect( + Collectors.toMap(IndicatorBottomCsvMapper::getIndicatorId, + IndicatorBottomCsvMapper::getCsvColumnName)); + + // 创建CSV策略并执行 + DataSourceStrategy csvStrategy = new CsvSourceStrategy( + evaluationCsvDataService, EvaluationCsvData::getRawData); + processEvaluation(request, userId, membershipFuncSet, topLevelList, indicator, mappingMap, + csvStrategy, indicatorWeightMap, indicatorEvalItemMap); + + } else { + throw new EvaluationException("不支持的数据源类型: " + dataSourceType); + } + + } catch (EvaluationException e) { + WsEvaluationServer.sendTips(e.getMessage(), request.getRandomKey()); + } + long end = System.currentTimeMillis(); + long diff = (end - now) / 1000; + WsEvaluationServer.sendTips("整体评估完成,总耗时" + diff + "秒", request.getRandomKey()); + } + + /** + * 统一的评估处理流程,与具体数据源解耦. + * + * @param strategy 数据源策略,封装了如何获取数据的具体实现 + */ + private void processEvaluation(PageEvaluationRequest request, Integer userId, + IndicatorTopSet membershipFuncSet, List topLevelList, + Indicator indicator, Map mappingMap, + DataSourceStrategy strategy, Map indicatorWeightMap, + Map> indicatorEvalItemMap) { + + //首先记录本次评估 + request.setMembership(membershipFuncSet.getMembershipFunc()); + evaluationHistoryService.saveWhole(request); + + boolean hasSpecificIds = request.getIds() != null && request.getIds().length > 0; + + if (hasSpecificIds) { + // --- 按指定ID列表进行评估 --- + List idList = Arrays.stream(request.getIds()).boxed().collect(Collectors.toList()); + List dataList = strategy.fetchByIds(idList); + + if (dataList != null && !dataList.isEmpty()) { + List evaluationData = strategy.extractData(dataList); + startEvaluation(request, userId, membershipFuncSet, topLevelList, indicator, evaluationData, + mappingMap, indicatorWeightMap, indicatorEvalItemMap); + } + } else { + // --- 分页处理所有数据进行评估 --- + PaginationBean paginationBean = new PaginationBean(); + paginationBean.setSearch(request.getSearch()); + paginationBean.setPageSize(DEFAULT_PAGE_SIZE); + + paginationBean.setRandomKey(request.getRandomKey()); + paginationBean.setBusinessKey(request.getModelId()); + Long totalRecords = strategy.count(paginationBean); + if (totalRecords == null || totalRecords == 0) { + return; // 没有数据,直接返回 + } + + int totalPages = (int) ((totalRecords + DEFAULT_PAGE_SIZE - 1) / DEFAULT_PAGE_SIZE); + + for (int currentPage = 1; currentPage <= totalPages; currentPage++) { + paginationBean.setCurrentPage(currentPage); + List currentPageData = strategy.fetchByPage(paginationBean); + + if (currentPageData != null && !currentPageData.isEmpty()) { + List evaluationData = strategy.extractData(currentPageData); + startEvaluation(request, userId, membershipFuncSet, topLevelList, indicator, + evaluationData, mappingMap, indicatorWeightMap, indicatorEvalItemMap); + } + } + } + } + + + /** + * 数据源策略接口。 定义了数据访问的统一契约,将数据获取的算法从主流程中分离出来. + * + * @param 数据源对应的实体类型 (如 FormValue, EvaluationCsvData) + */ + private interface DataSourceStrategy { + + List fetchByIds(List ids); + + List fetchByPage(PaginationBean paginationBean); + + Long count(PaginationBean paginationBean); + + List extractData(List dataList); + } + + /** + * 数据库数据源的具体实现策略. + */ + private static class DatabaseSourceStrategy implements DataSourceStrategy { + + private final FormValueService service; + private final Function dataExtractor; + + public DatabaseSourceStrategy(FormValueService service, + Function dataExtractor) { + this.service = service; + this.dataExtractor = dataExtractor; + } + + @Override + public List fetchByIds(List ids) { + return service.selectByIds(ids); + } + + @Override + public List fetchByPage(PaginationBean paginationBean) { + return service.list(paginationBean); + } + + @Override + public Long count(PaginationBean paginationBean) { + return service.count(paginationBean); + } + + @Override + public List extractData(List dataList) { + List list = new ArrayList<>(); + dataList.forEach(value -> { + SingleEvaluationData singleEvaluationData = new SingleEvaluationData(); + singleEvaluationData.setData(value.getModelData()); + singleEvaluationData.setId(value.getId()); + singleEvaluationData.setType("database"); + list.add(singleEvaluationData); + }); + return list; + } + } + + /** + * CSV文件数据源的具体实现策略. + */ + private static class CsvSourceStrategy implements DataSourceStrategy { + + private final EvaluationCsvDataService service; + private final Function dataExtractor; + + public CsvSourceStrategy(EvaluationCsvDataService service, + Function dataExtractor) { + this.service = service; + this.dataExtractor = dataExtractor; + } + + @Override + public List fetchByIds(List ids) { + + return service.selectByIds(ids); + } + + @Override + public List fetchByPage(PaginationBean paginationBean) { + return service.list(paginationBean); + } + + @Override + public Long count(PaginationBean paginationBean) { + return service.count(paginationBean); + } + + @Override + public List extractData(List dataList) { + List list = new ArrayList<>(); + dataList.forEach(value -> { + SingleEvaluationData singleEvaluationData = new SingleEvaluationData(); + singleEvaluationData.setId(value.getId()); + singleEvaluationData.setType("csv"); + singleEvaluationData.setData(value.getRawData()); + list.add(singleEvaluationData); + }); + return list; + } + } + + private EvaluationTemplate getTemplateOrThrow(Integer templateId) { + EvaluationTemplate template = evaluationTemplateService.getById(templateId); + if (template == null) { + throw new EvaluationException("没有找到对应的指标信息"); + } + return template; + } + + private IndicatorTopSet getMembershipFuncSetOrThrow(Integer indicatorTopId) { + IndicatorTopSet set = indicatorTopSetService.getIndicatorTopSet(indicatorTopId); + if (set == null) { + throw new EvaluationException("没有找到对应的隶属度函数"); + } + return set; + } + + private List getTopLevelListOrThrow(Integer indicatorTopId) { + List list = indicatorTopLevelService.getTopLevel(indicatorTopId); + if (list == null || list.isEmpty()) { + throw new EvaluationException("没有找到全局指标集区间和分值"); + } + return list; + } + + + private static class EvaluationException extends RuntimeException { + + public EvaluationException(String message) { + super(message); + } + } + + private GlobalEvaluationConfig globalEvaluationConfig(List topLevelList) { + + topLevelList.sort((a, b) -> Integer.compare(b.getLevelOrder(), a.getLevelOrder())); + List evaluationLevels = new ArrayList<>(); + + topLevelList.forEach(topLevel -> { + EvaluationLevel evaluationLevel = new EvaluationLevel(topLevel.getLevelName(), + Double.parseDouble(topLevel.getGrade())); + evaluationLevels.add(evaluationLevel); + }); + return new GlobalEvaluationConfig(evaluationLevels); + } + + /** + * 核心评估触发点(此方法保持不变). + */ + private void startEvaluation(PageEvaluationRequest request, Integer userId, + IndicatorTopSet membershipFuncSet, List topLevelList, + Indicator indicator, List originalList, Map mappingMap, + Map indicatorWeightMap, + Map> indicatorEvalItemMap) { + + long now = System.currentTimeMillis(); + WsEvaluationServer.sendTips("分批次评估" + originalList.size() + "条记录", + request.getRandomKey()); + + List resultList = new ArrayList<>(); + //全局level等级及代表分 + GlobalEvaluationConfig globalEvaluationConfig = globalEvaluationConfig(topLevelList); + //遍历数据 + for (SingleEvaluationData singleEvaluationData : originalList) { + JSONObject jsonObject = JSON.parseObject(singleEvaluationData.getData()); + Map valueMap = new HashMap<>(jsonObject); + IndicatorNode root = new IndicatorNode(indicator.getId() + "", indicator.getName()); + //工程ID + root.setProjectId(request.getProjectId()); + //记录原始数据ID + root.setOriginalId(indicator.getId()); + //记录数据来源 + root.setType(request.getDatasourceType()); + //本批次唯一标识 + root.setRandomKey(request.getRandomKey()); + //用户id + root.setUserId(userId); + //设置标识 + root.setLogicName(jsonObject.getString(request.getIdentifier()) == null ? "" + : jsonObject.getString(request.getIdentifier())); + root.setLevel(0); + //设置隶属函数 + root.setMembershipFunction(new GlobalMembershipFunction(membershipFuncSet.getMembershipFunc(), + Double.parseDouble(membershipFuncSet.getTriangleOverlapRatio()), + + Double.parseDouble(membershipFuncSet.getTrianglePeakRatio()), + Double.parseDouble(membershipFuncSet.getSoftEdgeS()), + globalEvaluationConfig)); + //设置权重 + root.setWeight(indicatorWeightMap.get(indicator.getId()) == null ? 1 + : Double.parseDouble(indicatorWeightMap.get(indicator.getId()))); + recursionBuild(valueMap, indicatorWeightMap, indicator, root, mappingMap, + globalEvaluationConfig, membershipFuncSet, indicatorEvalItemMap); + + FuzzyEvaluationService service = new FuzzyEvaluationService(globalEvaluationConfig); + service.performFuzzyEvaluation(root, FuzzyOperator.valueOf(request.getMethod())); + resultList.add(root); + } + saveResult(resultList); + + long end = System.currentTimeMillis(); + long diff = (end - now) / 1000; + WsEvaluationServer.sendTips( + "分批次结束评估" + originalList.size() + "条记录,耗时:" + diff + "秒", + request.getRandomKey()); + } + + private void saveResult(List resultList) { + resultList.forEach(indicatorNode -> { + evaluationRootResultService.saveWhole(indicatorNode); + }); + } + + /** + * 递归一个根指标,设置实际值,隶属度,权重. + * + * @param valueMap 实际值map key=字段名称 + * @param indicatorWeightMap 权重map key=指标ID + * @param indicator 当前指标 + * @param node 当前节点 + * @param mappingMap 指标id对应字段名称 + * @param globalEvaluationConfig 全局评价集集合 + * @param membershipFuncSet 全局隶属函数设置,告知采用那个函数 + * @param indicatorEvalItemMap 底部指标评价集区间 + */ + private void recursionBuild(Map valueMap, + Map indicatorWeightMap, + Indicator indicator, IndicatorNode node, Map mappingMap, + GlobalEvaluationConfig globalEvaluationConfig, IndicatorTopSet membershipFuncSet, + Map> indicatorEvalItemMap) { + if (indicator.getChildren() != null && !indicator.getChildren().isEmpty()) { + node.setChildren(new ArrayList<>()); + indicator.getChildren().forEach(child -> { + IndicatorNode childNode = new IndicatorNode(child.getId() + "", child.getName()); + childNode.setLevel(node.getLevel() + 1); + //设置隶属函数 + childNode.setMembershipFunction( + new GlobalMembershipFunction(membershipFuncSet.getMembershipFunc(), + Double.parseDouble(membershipFuncSet.getTriangleOverlapRatio()), + + Double.parseDouble(membershipFuncSet.getTrianglePeakRatio()), + Double.parseDouble(membershipFuncSet.getSoftEdgeS()), + globalEvaluationConfig)); + //设置权重 + childNode.setWeight(indicatorWeightMap.get(child.getId()) == null ? 1 + : Double.parseDouble(indicatorWeightMap.get(child.getId()))); + childNode.setOriginalId(child.getId()); + childNode.setRandomKey(node.getRandomKey()); + node.getChildren().add(childNode); + + recursionBuild(valueMap, indicatorWeightMap, child, childNode, mappingMap, + globalEvaluationConfig, membershipFuncSet, indicatorEvalItemMap); + }); + } else { //是叶子节点,设置值,设置 + //根据mappingMap获取这个指标对应的输入字段 + String fieldName = mappingMap.get(indicator.getId()); + if (fieldName != null) { + Object currentValue = valueMap.get(fieldName); + if (currentValue != null) { + node.setActualValue(Double.parseDouble(currentValue.toString())); + } + + } + if (indicatorEvalItemMap.get(indicator.getId()) != null) { + List indicatorEvalItemList = indicatorEvalItemMap.get(indicator.getId()); + List gradeRanges = getGradeRange(indicatorEvalItemList); + if (membershipFuncSet.getMembershipFunc().equals("TRAP_TRI")) { + node.setMembershipFunction(new LeafHybridMembershipFunction(gradeRanges, + Double.parseDouble(membershipFuncSet.getTriangleOverlapRatio()), + + Double.parseDouble(membershipFuncSet.getTrianglePeakRatio()), + Double.parseDouble(membershipFuncSet.getSoftEdgeS()), + globalEvaluationConfig)); + } else { + node.setMembershipFunction(new LeafFullTriangularMembershipFunction(gradeRanges, + Double.parseDouble(membershipFuncSet.getTriangleOverlapRatio()), + + Double.parseDouble(membershipFuncSet.getTrianglePeakRatio()), + Double.parseDouble(membershipFuncSet.getSoftEdgeS()), + globalEvaluationConfig)); + } + } + } + } + + private List getGradeRange(List indicatorEvalItemList) { + List list = new ArrayList<>(); + indicatorEvalItemList.sort( + Comparator.comparingDouble(a -> Double.parseDouble(a.getBottomValue()))); + indicatorEvalItemList.forEach(indicatorEvalItem -> { + GradeRange gradeRange = new GradeRange(indicatorEvalItem.getEvaluationName(), + Double.parseDouble(indicatorEvalItem.getBottomValue()), + Double.parseDouble(indicatorEvalItem.getTopValue())); + list.add(gradeRange); + }); + return list; + } +} \ No newline at end of file diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationCsvDataServiceImpl.java b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationCsvDataServiceImpl.java index 215b5eb..c7142d1 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationCsvDataServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationCsvDataServiceImpl.java @@ -1,20 +1,61 @@ package com.hshh.evaluation.service.impl; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hshh.evaluation.bean.CsvUploadBean; import com.hshh.evaluation.entity.EvaluationCsvData; import com.hshh.evaluation.mapper.EvaluationCsvDataMapper; -import com.hshh.evaluation.service.IEvaluationCsvDataService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hshh.evaluation.service.EvaluationCsvDataService; +import com.hshh.system.common.bean.PaginationBean; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** - *

- * 服务实现类 - *

+ * 服务实现类. * * @author liDongYu * @since 2025-08-21 */ @Service -public class EvaluationCsvDataServiceImpl extends ServiceImpl implements IEvaluationCsvDataService { +public class EvaluationCsvDataServiceImpl extends + ServiceImpl implements + EvaluationCsvDataService { + @Transactional(rollbackFor = Exception.class) + @Override + public void saveWhole(List> dataList, CsvUploadBean uploadInfo) { + dataList.forEach(map -> { + StringBuilder header = new StringBuilder(); + EvaluationCsvData evaluationCsvData = new EvaluationCsvData(); + //设置原始数据 + evaluationCsvData.setRawData(JSON.toJSONString(map)); + //设置随机key + evaluationCsvData.setRandomKey(uploadInfo.getRandomKey()); + //时间 + evaluationCsvData.setCreateTime(LocalDateTime.now()); + //工程 + evaluationCsvData.setProjectId(uploadInfo.getProjectId()); + //设置表头 + evaluationCsvData.setCsvHeader(JSON.toJSONString(map.keySet())); + save(evaluationCsvData); + }); + } + + @Override + public List list(PaginationBean paginationBean) { + return this.baseMapper.list(paginationBean); + } + + @Override + public Long count(PaginationBean paginationBean) { + return this.baseMapper.count(paginationBean); + } + + @Override + public List selectByIds(List ids) { + return this.baseMapper.selectByIds(ids); + } } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationHistoryServiceImpl.java b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationHistoryServiceImpl.java index e9d113b..c57a15e 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationHistoryServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationHistoryServiceImpl.java @@ -1,10 +1,15 @@ package com.hshh.evaluation.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hshh.evaluation.bean.PageEvaluationRequest; import com.hshh.evaluation.entity.EvaluationHistory; import com.hshh.evaluation.mapper.EvaluationHistoryMapper; import com.hshh.evaluation.service.EvaluationHistoryService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.time.LocalDateTime; +import java.util.List; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -15,7 +20,38 @@ import org.springframework.stereotype.Service; * @since 2025-08-21 */ @Service -public class EvaluationHistoryServiceImpl extends ServiceImpl implements +public class EvaluationHistoryServiceImpl extends + ServiceImpl implements EvaluationHistoryService { + @Transactional + @Override + public void saveWhole(PageEvaluationRequest request) { + EvaluationHistory history = new EvaluationHistory(); + history.setCreateTime(LocalDateTime.now()); + history.setUserId(request.getUserId()); + history.setRandomKey(request.getRandomKey()); + history.setProjectId(request.getProjectId()); + history.setDatasourceType(request.getDatasourceType()); + history.setMembershipFunc(request.getMembership()); + history.setFuzzyOperator(request.getMethod()); + save(history); + } + + @Override + public EvaluationHistory queryRecentByProjectId(Integer projectId) { + List list = this.baseMapper.queryRecentByProjectId(projectId); + if (!list.isEmpty()) { + return list.get(0); + } + return null; + } + + @Override + public List queryListByProjectId(Integer projectId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("project_id", projectId); + queryWrapper.orderByDesc("id"); + return this.baseMapper.selectList(queryWrapper); + } } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationProjectServiceImpl.java b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationProjectServiceImpl.java index a7aa2b9..798db1f 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationProjectServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationProjectServiceImpl.java @@ -2,27 +2,30 @@ package com.hshh.evaluation.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.hshh.evaluation.bean.EvaluationRequest; -import com.hshh.evaluation.entity.EvaluationHistory; +import com.hshh.evaluation.bean.CsvUploadBean; +import com.hshh.evaluation.bean.PageEvaluationRequest; import com.hshh.evaluation.entity.EvaluationProject; -import com.hshh.evaluation.entity.EvaluationTemplate; import com.hshh.evaluation.mapper.EvaluationProjectMapper; -import com.hshh.evaluation.service.EvaluationHistoryService; +import com.hshh.evaluation.service.CoreEvaluationService; +import com.hshh.evaluation.service.EvaluationCsvDataService; import com.hshh.evaluation.service.EvaluationProjectService; -import com.hshh.evaluation.service.EvaluationTemplateService; -import com.hshh.model.entity.FormValue; -import com.hshh.model.service.FormValueService; import com.hshh.system.base.service.TableRelationsService; import com.hshh.system.common.bean.PaginationBean; -import com.hshh.system.ws.WsEvaluationServer; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.Map; import java.util.stream.Collectors; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; +import org.apache.commons.csv.CSVRecord; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,29 +40,25 @@ import org.springframework.transaction.annotation.Transactional; public class EvaluationProjectServiceImpl extends ServiceImpl implements EvaluationProjectService { - private static final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - //每次评估一批数据的长度 - private static final int pageSize = 100; + /** * 数据库引用关系记录服务类. */ @Resource private TableRelationsService tableRelationsService; + + /** - * 评估历史服务类. + * 上传的csv文件数据记录服务类. */ @Resource - private EvaluationHistoryService evaluationHistoryService; + private EvaluationCsvDataService evaluationCsvDataService; /** - * 评估模板服务类. + * 数据库记录评估服务. */ @Resource - private EvaluationTemplateService evaluationTemplateService; - /** - * 数据查询服务类. - */ - @Resource - private FormValueService formValueService; + private CoreEvaluationService coreEvaluationService; + @Override public List list(PaginationBean paginationBean) { @@ -103,125 +102,47 @@ public class EvaluationProjectServiceImpl extends */ @Override @Transactional(rollbackFor = Exception.class) - public void evaluate(EvaluationRequest request, Integer userId) { + public void evaluate(PageEvaluationRequest request, Integer userId) { + //评估接口单列 + coreEvaluationService.evaluation(request, userId); - //查询模板然后获取指标ID - EvaluationTemplate template = evaluationTemplateService.getById(request.getTemplateId()); + } - //发送开始处理消息 - sendTips("开始处理", request.getRandomKey()); + @Override + public void uploadCsv(CsvUploadBean uploadInfo) throws IOException { + CSVFormat format = CSVFormat.DEFAULT + .builder() + .setHeader() // 表示第一行就是表头 + .setSkipHeaderRecord(true) // 跳过第一行数据,不把它算到记录里 + .setIgnoreEmptyLines(true) + .setTrim(true) + .build(); + //获取表头信息 + List> rows = new ArrayList<>(); + try (Reader reader = new InputStreamReader(uploadInfo.getFile().getInputStream(), + StandardCharsets.UTF_8); + CSVParser parser = new CSVParser(reader, format)) { - //插入评估历史表 - Integer historyId = insertEvaluationHistory(request, userId); - //处理来自于数据库的记录 - if (request.getDatasourceType().equals("database")) { - handleDataBaseData(request, template.getIndicatorTopId(), historyId, userId); - } - //处理来自于 csv导入的记录 - if (request.getDatasourceType().equals("csv")) { - handleCsvData(request, template.getIndicatorTopId(), historyId, userId); + // 取有序表头:Apache 返回 Map<列名, 索引>,按索引排序得到原始顺序 + List headers = parser.getHeaderMap() + .entrySet() + .stream() + .sorted(Comparator.comparingInt(Map.Entry::getValue)) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + for (CSVRecord rec : parser) { + Map obj = new LinkedHashMap<>(); + for (String h : headers) { + // get(h):按列名取值,可能为 null + obj.put(h, rec.isMapped(h) ? rec.get(h) : null); + } + rows.add(obj); + + + } + evaluationCsvDataService.saveWhole(rows, uploadInfo); } - - } - - //根据searchKey查询 - - /** - * 处理数据库的记录. - * - * @param request 评估请求. - * @param indicatorTopId 指标ID - * @param historyId 历史记录ID - * @param userId 用户ID - */ - private void handleDataBaseData(EvaluationRequest request, Integer indicatorTopId, - Integer historyId, Integer userId) { - - sendTips("数据来源:数据库记录", request.getRandomKey()); - AtomicInteger count = new AtomicInteger(0); - //查询记录总条数 - PaginationBean pageBean = new PaginationBean(); - pageBean.setId(request.getModelId()); - pageBean.setSearch(request.getSearch()); - Long total = formValueService.count(pageBean); - - sendTips("数据记录条数" + total, request.getRandomKey()); - - int totalPage = (int) Math.ceil(total / (double) pageSize); - //开始循坏评估 - for (int i = 1; i <= totalPage; i++) { - pageBean.setCurrentPage(1); - pageBean.setPageSize(pageSize); - pageBean.setSearch(request.getSearch()); - //查询 - List originalList = formValueService.list(pageBean); - count.addAndGet(originalList.size()); - - //把表单数据映射为一个列表 - List dataList = originalList.stream() - .map(FormValue::getModelData).collect(Collectors.toList()); - evaluationOneBatchData(dataList, request, indicatorTopId, historyId, userId); - - sendTips(originalList.size() + "数据评估完成,累计完成(" + count.get() + ")", - request.getRandomKey()); - } - - sendTips("数据全部评估完成,累计评估(" + count.get() + ")", request.getRandomKey()); - - } - - /** - * 处理CSV的记录. - * - * @param request 评估请求. - * @param indicatorTopId 指标ID - * @param historyId 历史记录ID - * @param userId 用户ID - */ - private void handleCsvData(EvaluationRequest request, Integer indicatorTopId, Integer historyId, - Integer userId) { - - } - - - /** - * 评估一批数据. - * - * @param data 待评估数据 - * @param request 请求信息 - * @param indicatorTopId 指标ID - * @param historyId 历史记录ID - * @param userId 用户ID - */ - private void evaluationOneBatchData(List data, EvaluationRequest request, - Integer indicatorTopId, Integer historyId, Integer userId) { - //结果集定义 - List resultList = new ArrayList<>(); - for (String rawData : data) { - - } - } - - - /** - * 插入评估历史表,返回ID. - * - * @param request 评估请求 - */ - private Integer insertEvaluationHistory(EvaluationRequest request, Integer userId) { - EvaluationHistory history = new EvaluationHistory(); - history.setProjectId(request.getProjectId()); - history.setCreateTime(LocalDateTime.now()); - history.setUserId(userId); - history.setRandomKey(request.getRandomKey()); - evaluationHistoryService.save(history); - return history.getId(); - } - - void sendTips(String message, String randomKey) { - //发送开始处理消息 - LocalDateTime start = LocalDateTime.now(); - WsEvaluationServer.sendToKey(randomKey, start.format(df) + " " + message); } } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationResultServiceImpl.java b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationResultServiceImpl.java deleted file mode 100644 index e6e5cf1..0000000 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationResultServiceImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.hshh.evaluation.service.impl; - -import com.hshh.evaluation.entity.EvaluationResult; -import com.hshh.evaluation.mapper.EvaluationResultMapper; -import com.hshh.evaluation.service.EvaluationResultService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -/** - *

- * 评估结果表 服务实现类 - *

- * - * @author liDongYu - * @since 2025-08-21 - */ -@Service -public class EvaluationResultServiceImpl extends ServiceImpl implements - EvaluationResultService { - -} diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateIndicatorWeightServiceImpl.java b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateIndicatorWeightServiceImpl.java index d1a571f..580d926 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateIndicatorWeightServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateIndicatorWeightServiceImpl.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -24,7 +25,7 @@ public class EvaluationTemplateIndicatorWeightServiceImpl extends EvaluationTemplateIndicatorWeightService { @Override - public Map getEvaluationTemplateIndicatorWeightMap(Integer indicatorTopId, + public Map getEvaluationTemplateIndicatorWeightMap(Integer indicatorTopId, Integer templateId) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("indicator_top_id", indicatorTopId); @@ -37,4 +38,26 @@ public class EvaluationTemplateIndicatorWeightServiceImpl extends } return Map.of(); } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveEvaluationTemplateIndicatorWeight(Integer templateId, Integer indicatorTopId, + List list) { + //先删除旧信息 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("template_id", templateId); + wrapper.eq("indicator_top_id", indicatorTopId); + this.remove(wrapper); + if (list != null && !list.isEmpty()) { + list.forEach(this::save); + } + } + + @Override + public void deleteByTemplateIdAndIndicatorTopId(Integer templateId, Integer indicatorTopId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("template_id", templateId); + wrapper.eq("indicator_top_id", indicatorTopId); + this.remove(wrapper); + } } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateServiceImpl.java b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateServiceImpl.java index 72b381a..76073d0 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateServiceImpl.java @@ -3,13 +3,15 @@ package com.hshh.evaluation.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hshh.evaluation.entity.EvaluationTemplate; +import com.hshh.evaluation.entity.EvaluationTemplateIndicatorWeight; import com.hshh.evaluation.entity.EvaluationTemplateWeight; import com.hshh.evaluation.mapper.EvaluationTemplateMapper; +import com.hshh.evaluation.service.EvaluationTemplateIndicatorWeightService; import com.hshh.evaluation.service.EvaluationTemplateService; import com.hshh.evaluation.service.EvaluationTemplateWeightService; import com.hshh.system.common.bean.PaginationBean; +import java.util.ArrayList; import java.util.List; -import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,8 +26,16 @@ import org.springframework.transaction.annotation.Transactional; public class EvaluationTemplateServiceImpl extends ServiceImpl implements EvaluationTemplateService { + /** + * 指标互比详情服务类. + */ @Resource - private EvaluationTemplateWeightService evaluationTemplateWeightService; + private EvaluationTemplateWeightService evaluationTemplateDetailWeightService; + /** + * 指标权重服务类. + */ + @Resource + private EvaluationTemplateIndicatorWeightService evaluationTemplateIndicatorWeightService; @Override public List list(PaginationBean search) { @@ -39,42 +49,52 @@ public class EvaluationTemplateServiceImpl extends @Transactional(rollbackFor = Exception.class) @Override - public void saveWhole(EvaluationTemplate evaluationTemplate, - Map weightDataMap) { + public void saveWhole(EvaluationTemplate evaluationTemplate + ) { + //保存或者更新模板信息 saveOrUpdate(evaluationTemplate); - if (weightDataMap != null && !weightDataMap.isEmpty()) { - weightDataMap.forEach((k, v) -> { - //先按模板ID+上级指标ID - evaluationTemplateWeightService.deleteEvaluationTemplateWeightWithTemplateIdAndIndicatorId( - evaluationTemplate.getId(), evaluationTemplate.getIndicatorTopId(), k); - v.getWeight().forEach(weightBeanList -> { - weightBeanList.forEach(weightBean -> { - EvaluationTemplateWeight evaluationTemplateWeight = new EvaluationTemplateWeight(); - //设置模板ID - evaluationTemplateWeight.setTemplateId(evaluationTemplate.getId()); - //设置权重 - evaluationTemplateWeight.setWeight(Double.valueOf(weightBean.getValue())); - //设置顶级指标ID - evaluationTemplateWeight.setIndicatorTopId(evaluationTemplate.getIndicatorTopId()); - //fromIndicatorId - evaluationTemplateWeight.setFromIndicatorId(weightBean.getRowId()); - //toIndicatorId - evaluationTemplateWeight.setToIndicatorId(weightBean.getColId()); - //设置上级指标ID - evaluationTemplateWeight.setIndicatorParentId(weightBean.getParentId()); - //设置行号 - evaluationTemplateWeight.setRowNum(weightBean.getRowNum()); - //保存 - evaluationTemplateWeightService.save(evaluationTemplateWeight); - }); - - - }); + //保存指标权重信息 + List indicatorWeightList = new ArrayList<>(); + if (evaluationTemplate.getIndicatorWeightList() != null + && !evaluationTemplate.getIndicatorWeightList() + .isEmpty()) { + evaluationTemplate.getIndicatorWeightList().forEach(a -> { + EvaluationTemplateIndicatorWeight indicatorWeight = new EvaluationTemplateIndicatorWeight(); + indicatorWeight.setWeight(a.getWeight()); + //设置模板ID + indicatorWeight.setTemplateId(evaluationTemplate.getId()); + //设置顶级指标ID + indicatorWeight.setIndicatorTopId(evaluationTemplate.getIndicatorTopId()); + //设置指标ID + indicatorWeight.setIndicatorId(a.getIndicatorId()); + indicatorWeightList.add(indicatorWeight); }); - + evaluationTemplateIndicatorWeightService.saveEvaluationTemplateIndicatorWeight( + evaluationTemplate.getId(), evaluationTemplate.getIndicatorTopId(), indicatorWeightList); } + //保存各个指标之间互相比较的权重信息 + if (evaluationTemplate.getTemplateDetailWeightList() != null + && !evaluationTemplate.getTemplateDetailWeightList() + .isEmpty()) { + List detailList = new ArrayList<>(); + evaluationTemplate.getTemplateDetailWeightList().forEach(a -> { + EvaluationTemplateWeight detailWeight = new EvaluationTemplateWeight(); + //设置模板ID + detailWeight.setTemplateId(evaluationTemplate.getId()); + //设置顶级指标ID + detailWeight.setIndicatorTopId(evaluationTemplate.getIndicatorTopId()); + detailWeight.setFromIndicatorId(a.getRowId()); + detailWeight.setToIndicatorId(a.getColId()); + detailWeight.setWeight(a.getValue()); + detailWeight.setIndicatorParentId(a.getParentId()); + detailWeight.setRowNum(a.getRowNum()); + detailList.add(detailWeight); + }); + evaluationTemplateDetailWeightService.saveIndicatorMatrix(evaluationTemplate.getId(), + evaluationTemplate.getIndicatorTopId(), detailList); + } } @Override @@ -87,8 +107,14 @@ public class EvaluationTemplateServiceImpl extends @Transactional(rollbackFor = Exception.class) @Override public void deleteTemplate(EvaluationTemplate evaluationTemplate) { - evaluationTemplateWeightService.deleteEvaluationTemplateWeightWithTemplateId( - evaluationTemplate.getId()); + + //删除互比信息 + evaluationTemplateDetailWeightService.deleteByTemplateIdAndIndicatorTopId( + evaluationTemplate.getId(), evaluationTemplate.getIndicatorTopId()); + //删除指标权重信息 + evaluationTemplateIndicatorWeightService.deleteByTemplateIdAndIndicatorTopId( + evaluationTemplate.getId(), evaluationTemplate.getIndicatorTopId()); + //删除模板 this.removeById(evaluationTemplate.getId()); } diff --git a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateWeightServiceImpl.java b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateWeightServiceImpl.java index 5c8d655..1f2efce 100644 --- a/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateWeightServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/evaluation/service/impl/EvaluationTemplateWeightServiceImpl.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; /** *

@@ -25,25 +24,6 @@ public class EvaluationTemplateWeightServiceImpl extends EvaluationTemplateWeightService { - @Transactional(rollbackFor = Exception.class) - @Override - public void deleteEvaluationTemplateWeightWithTemplateIdAndIndicatorId(Integer templateId, - Integer indicatorTopId, Integer parentId) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("template_id", templateId); - queryWrapper.eq("indicator_top_id", indicatorTopId); - queryWrapper.eq("indicator_parent_id", parentId); - this.remove(queryWrapper); - } - - @Override - public void deleteEvaluationTemplateWeightWithTemplateId(Integer templateId) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("template_id", templateId); - - this.remove(queryWrapper); - } - @Override public List queryListByIndicatorParentIdAndTemplateId( Integer indicatorParentId, Integer templateId) { @@ -57,7 +37,7 @@ public class EvaluationTemplateWeightServiceImpl extends @Override public Map> groupByParentIndicatorId( Integer indicatorParentId, Integer templateId) { - List list = this.queryListByIndicatorParentIdAndTemplateId( + List list = this.queryListByIndicatorTopIdAndTemplateId( indicatorParentId, templateId); if (!list.isEmpty()) { return list.stream() @@ -65,4 +45,33 @@ public class EvaluationTemplateWeightServiceImpl extends } return Map.of(); } + + @Override + public void saveIndicatorMatrix(Integer templateId, Integer indicatorTopId, + List weightList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("template_id", templateId); + queryWrapper.eq("indicator_top_id", indicatorTopId); + this.remove(queryWrapper); + if (weightList != null && !weightList.isEmpty()) { + weightList.forEach(this::save); + } + } + + @Override + public void deleteByTemplateIdAndIndicatorTopId(Integer templateId, Integer indicatorTopId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("template_id", templateId); + queryWrapper.eq("indicator_top_id", indicatorTopId); + this.remove(queryWrapper); + } + + @Override + public List queryListByIndicatorTopIdAndTemplateId( + Integer indicatorTopId, Integer templateId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("template_id", templateId); + queryWrapper.eq("indicator_top_id", indicatorTopId); + return this.list(queryWrapper); + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorEvalBean.java b/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorEvalBean.java new file mode 100644 index 0000000..a4ddeff --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorEvalBean.java @@ -0,0 +1,26 @@ +package com.hshh.indicator.bean; + +import com.hshh.indicator.entity.IndicatorEvalItem; +import com.hshh.system.common.bean.JsTree; +import java.util.List; +import lombok.Data; + + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class IndicatorEvalBean { + + private List jsTreeList; + //评价集范围 + private List evalItemList; + //顶级指标ID + private Integer indicatorTopId; +} diff --git a/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorSetBean.java b/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorSetBean.java new file mode 100644 index 0000000..6f3dec2 --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorSetBean.java @@ -0,0 +1,19 @@ +package com.hshh.indicator.bean; + +import com.hshh.indicator.entity.IndicatorTopLevel; +import com.hshh.indicator.entity.IndicatorTopSet; +import java.util.List; +import lombok.Data; + +/** + * 接收全局指标level,隶属函数bean. + * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class IndicatorSetBean { + + private List levels; + private IndicatorTopSet topSet; +} diff --git a/manager-admin/src/main/java/com/hshh/indicator/controller/EvaluationController.java b/manager-admin/src/main/java/com/hshh/indicator/controller/EvaluationController.java index 6f070cf..83bb7d1 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/controller/EvaluationController.java +++ b/manager-admin/src/main/java/com/hshh/indicator/controller/EvaluationController.java @@ -1,20 +1,23 @@ package com.hshh.indicator.controller; +import com.hshh.indicator.bean.IndicatorEvalBean; import com.hshh.indicator.entity.Indicator; import com.hshh.indicator.entity.IndicatorEvalItem; import com.hshh.indicator.service.IndicatorEvalItemService; import com.hshh.indicator.service.IndicatorService; +import com.hshh.indicator.service.IndicatorTopLevelService; +import com.hshh.indicator.service.IndicatorTopSetService; +import com.hshh.system.annotation.LogOperation; import com.hshh.system.common.bean.BaseController; +import com.hshh.system.common.bean.JsTree; import com.hshh.system.common.bean.OperateResult; -import com.hshh.system.common.enums.ErrorCode; -import com.hshh.system.common.enums.ErrorMessage; -import io.swagger.v3.oas.annotations.Operation; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import javax.annotation.Resource; -import javax.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -32,13 +35,14 @@ import org.springframework.web.bind.annotation.ResponseBody; @RequestMapping("/evaluation") public class EvaluationController extends BaseController { + /** - * 指标服务类. 查询所有指标列表 + * 指标服务类. */ @Resource private IndicatorService indicatorService; /** - * 评价服务类. + * 指标评价集范围服务类. */ @Resource private IndicatorEvalItemService indicatorEvalItemService; @@ -49,107 +53,87 @@ public class EvaluationController extends BaseController { * @return indicator/evaluation_list.html */ @GetMapping("/evaluationList") - public String evaluationList(Integer topIndicatorId, Integer indicatorId, Model model) { + public String evaluationList(Model model) { setNavigateTitle(model, "/evaluation/evaluationList"); - List rootList = indicatorService.queryRootList(); - if (rootList != null && !rootList.isEmpty()) { - if (topIndicatorId != null) { - for (Indicator indicator : rootList) { - if (indicator.getId().equals(topIndicatorId)) { - //回显上次选择的 - indicator.setChecked(true); - } - } - } - } - //查询所有没有孩子的子节点 - if (topIndicatorId != null) { - List indicatorListWithoutChildren = indicatorService.selectNoChildByTopId( - topIndicatorId); - if (!indicatorListWithoutChildren.isEmpty()) { - { - for (Indicator indicator : indicatorListWithoutChildren) { - if (indicator.getId().equals(indicatorId)) { - indicator.setChecked(true); - } - } - } - //查询子指标的评价集 - List evaluationList = indicatorEvalItemService.queryListByIndicatorId( - (indicatorId == null ? indicatorListWithoutChildren.get(0).getId() : indicatorId) - ); - model.addAttribute("evaluationList", evaluationList); - model.addAttribute("indicatorListWithoutChildren", indicatorListWithoutChildren); - } - - } - - model.addAttribute("rootList", rootList); - + List bottomList = indicatorService.queryRootList(); + model.addAttribute("rootList", bottomList); return "indicator/evaluation_list"; } /** - * 导航到评价集增加页面. + * 获取当前指标的评价信息. * - * @return indicator/add_evaluation.html + * @param id 指标ID + * @return 评价详细信息 */ - @RequestMapping("/evaluationAdd") - @Operation(summary = "导航到评价集增加页面", description = "导航到评价集增加页面") - public String evaluationAdd() { - return "indicator/add_evaluation"; + @GetMapping("/{id}") + @ResponseBody + + public OperateResult metricIdChange(@PathVariable("id") Integer id) { + IndicatorEvalBean indicatorEvalBean = new IndicatorEvalBean(); + + //查询底部评价集 + indicatorEvalBean.setJsTreeList(evalItemTree(id)); + return OperateResult.success(indicatorEvalBean); } /** - * 保存评价集. + * 建立底部指标树. * - * @param item 评价集数据 - * @param bindingResult 字段错误信息 + * @param id 根指标 + * @return 包含底部指标的树 + */ + private List evalItemTree(Integer id) { + List jsTreeList = new ArrayList<>(); + JsTree jsTree = new JsTree(); + jsTree.setText("根指标"); + jsTree.setId("0"); + jsTreeList.add(jsTree); + jsTree.setChildren(new ArrayList<>()); + //查询根部指标所有底部指标 + List bottomList = indicatorService.selectNoChildByTopId( + id); + //查询底部指标的评价集范围 + Map> evalMap = indicatorEvalItemService.getIndicatorEvalItemMapByIndicatorTopId( + id); + bottomList.forEach(a -> { + JsTree child = new JsTree(); + jsTree.getChildren().add(child); + child.setId("tree_" + a.getId()); + child.setOriginalId(a.getId()); + child.setText(a.getName()); + if (evalMap.containsKey(a.getId())) { + List evalItemList = evalMap.get(a.getId()); + evalItemList = evalItemList.stream().peek(aa -> { + if (aa.getEqualValue() == null) { + aa.setEqualValue(""); + } + }).collect(Collectors.toList()); + StringBuilder tipBuilder = new StringBuilder(); + evalItemList.forEach(evalItem -> { + tipBuilder.append(evalItem.getEvaluationName()).append(":") + .append(evalItem.getBottomValue()) + .append(",").append(evalItem.getTopValue()); + child.setText(a.getName() + "(" + tipBuilder + ")"); + }); + child.getData().put("range", evalItemList); + } + + }); + return jsTreeList; + } + + /** + * 保存评价集,隶属函数设置,评级集枚举和分值. + * + * @param data 前端数据 * @return 操作结果 */ @PostMapping("/save") @ResponseBody - public OperateResult save(@Valid @RequestBody IndicatorEvalItem item, - BindingResult bindingResult) { - if (bindingResult.hasErrors()) { - return errorsInputHandle(bindingResult); - } - indicatorEvalItemService.saveOrUpdate(item); + @LogOperation("保存评价集") + public OperateResult save(@RequestBody IndicatorEvalBean data) { + indicatorEvalItemService.saveWhole(data); return OperateResult.success(); } - - /** - * 根据id删除评价. - * - * @param id 要删除的id - * @return 操作结果 - */ - @GetMapping("/remove/{id}") - @ResponseBody - public OperateResult remove(@PathVariable("id") Integer id) { - IndicatorEvalItem evaluation = indicatorEvalItemService.getById(id); - if (evaluation == null) { - return OperateResult.error(null, ErrorMessage.ID_NOT_EXIT.getMessage(), - ErrorCode.BUSINESS_ERROR.getCode()); - } - indicatorEvalItemService.removeById(id); - return OperateResult.success(); - } - - /** - * 根据ID查询评价信息. - * - * @param id 评价ID - * @return id对应的评价 - */ - @GetMapping("/{id}") - @ResponseBody - public OperateResult view(@PathVariable("id") Integer id) { - IndicatorEvalItem evaluation = indicatorEvalItemService.getById(id); - if (evaluation == null) { - return OperateResult.error(null, ErrorMessage.ID_NOT_EXIT.getMessage(), - ErrorCode.BUSINESS_ERROR.getCode()); - } - return OperateResult.success(evaluation, ErrorMessage.SUCCESS.getMessage()); - } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorController.java b/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorController.java index bd0c648..bef7995 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorController.java +++ b/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorController.java @@ -17,6 +17,7 @@ import com.hshh.model.entity.FormFieldConfig; import com.hshh.model.entity.ModelDefine; import com.hshh.model.service.FormFieldConfigService; import com.hshh.model.service.ModelDefineService; +import com.hshh.system.annotation.LogOperation; import com.hshh.system.common.bean.BaseController; import com.hshh.system.common.bean.CheckedBean; import com.hshh.system.common.bean.OperateResult; @@ -138,7 +139,7 @@ public class IndicatorController extends BaseController { List modelDefineList = modelDefineService.list(); model.addAttribute("modelDefineList", modelDefineList); } - return "/indicator/add_indicator"; + return "indicator/add_indicator"; } /** @@ -165,6 +166,7 @@ public class IndicatorController extends BaseController { * @param bindingResult 字段验证信息 * @return 保存结果 */ + @LogOperation("保存指标") @PostMapping("/save") @ResponseBody @Operation(summary = "保存指标", description = "验证后保存指标") @@ -202,6 +204,7 @@ public class IndicatorController extends BaseController { */ @GetMapping("/remove/{id}") @ResponseBody + @LogOperation("删除指标") @Operation(summary = "删除指标", description = "根据ID删除指定指标") public OperateResult remove(@PathVariable("id") Integer id) { if (id == null) { @@ -337,6 +340,7 @@ public class IndicatorController extends BaseController { */ @PostMapping("/uploadCsv") @ResponseBody + @LogOperation("上传csv文件") public OperateResult> uploadCsv(@RequestParam("file") MultipartFile file, Integer indicatorTopId) throws IOException { List list = indicatorService.saveIndicatorTopCsvMapper(indicatorTopId, @@ -356,6 +360,7 @@ public class IndicatorController extends BaseController { */ @PostMapping("/indicatorFormMapper") @ResponseBody + @LogOperation("保存指标和form表单ID的映射关系") public OperateResult> saveIndicatorFormMapper( @RequestBody IndicatorFormMapper formMapper) { indicatorTopMapperService.saveFormMapper(formMapper); diff --git a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorSetController.java b/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorSetController.java new file mode 100644 index 0000000..dd183e0 --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorSetController.java @@ -0,0 +1,42 @@ +package com.hshh.indicator.controller; + +import com.hshh.indicator.bean.IndicatorSetBean; +import com.hshh.system.common.bean.BaseController; +import com.hshh.system.common.bean.OperateResult; +import io.swagger.v3.oas.annotations.tags.Tag; +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +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; + +/** + * 指标全局函数设置. + * + * @author LiDongYU + * @since 2025/7/22 + */ +@Controller +@RequestMapping("/indicatorSet") +@Tag(name = "指标全局函数设置", description = "指标全局函数设置") +public class IndicatorSetController extends BaseController { + + /** + * 指标全局函数默认设置页面. + * + * @param model 数据容器 + * @param request 页面请求 + * @return indicator_set.html + */ + @GetMapping("/list") + public String list(Model model, HttpServletRequest request) { + setNavigateTitle(model, "/indicatorSet/list"); + return "system/indicator/indicator_set"; + } + @PostMapping("/save") + public OperateResult save(@RequestBody IndicatorSetBean indicatorSetBean) { + + } +} diff --git a/manager-admin/src/main/java/com/hshh/indicator/entity/Indicator.java b/manager-admin/src/main/java/com/hshh/indicator/entity/Indicator.java index 97fbd5b..f4de6d6 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/entity/Indicator.java +++ b/manager-admin/src/main/java/com/hshh/indicator/entity/Indicator.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.hshh.system.common.bean.CheckedBean; import java.util.List; +import java.util.Map; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import lombok.Data; @@ -47,5 +48,15 @@ public class Indicator extends CheckedBean { @TableField(exist = false) private double weight; + //当前值 + @TableField(exist = false) + private String value; + //隶属度描述 + @TableField(exist = false) + private Map membership; + + //得分 + @TableField(exist = false) + private String score; } diff --git a/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorBottomCsvMapper.java b/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorBottomCsvMapper.java index 886f65a..04b9974 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorBottomCsvMapper.java +++ b/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorBottomCsvMapper.java @@ -1,6 +1,7 @@ package com.hshh.indicator.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; @@ -17,58 +18,69 @@ import java.io.Serializable; public class IndicatorBottomCsvMapper implements Serializable { - private static final long serialVersionUID = 1L; - @TableId(value = "id", type = IdType.AUTO) - private Integer id; + private static final long serialVersionUID = 1L; + @TableId(value = "id", type = IdType.AUTO) + private Integer id; - private Integer indicatorTopId; + private Integer indicatorTopId; - private Integer indicatorId; + private Integer indicatorId; - private Integer csvColumnId; + private Integer csvColumnId; - public Integer getId() { - return id; - } + public Integer getId() { + return id; + } - public void setId(Integer id) { - this.id = id; - } + public void setId(Integer id) { + this.id = id; + } - public Integer getIndicatorTopId() { - return indicatorTopId; - } + public Integer getIndicatorTopId() { + return indicatorTopId; + } - public void setIndicatorTopId(Integer indicatorTopId) { - this.indicatorTopId = indicatorTopId; - } + public void setIndicatorTopId(Integer indicatorTopId) { + this.indicatorTopId = indicatorTopId; + } - public Integer getIndicatorId() { - return indicatorId; - } + public Integer getIndicatorId() { + return indicatorId; + } - public void setIndicatorId(Integer indicatorId) { - this.indicatorId = indicatorId; - } + public void setIndicatorId(Integer indicatorId) { + this.indicatorId = indicatorId; + } - public Integer getCsvColumnId() { - return csvColumnId; - } + public Integer getCsvColumnId() { + return csvColumnId; + } - public void setCsvColumnId(Integer csvColumnId) { - this.csvColumnId = csvColumnId; - } + public void setCsvColumnId(Integer csvColumnId) { + this.csvColumnId = csvColumnId; + } - @Override - public String toString() { - return "IndicatorBottomCsvMapper{" + + @Override + public String toString() { + return "IndicatorBottomCsvMapper{" + "id = " + id + ", indicatorTopId = " + indicatorTopId + ", indicatorId = " + indicatorId + ", csvColumnId = " + csvColumnId + "}"; - } + } + + @TableField(exist = false) + private String csvColumnName; + + public String getCsvColumnName() { + return csvColumnName; + } + + public void setCsvColumnName(String csvColumnName) { + this.csvColumnName = csvColumnName; + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorBottomFormMapper.java b/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorBottomFormMapper.java index bc8e00a..f41faa5 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorBottomFormMapper.java +++ b/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorBottomFormMapper.java @@ -1,6 +1,7 @@ package com.hshh.indicator.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; @@ -28,10 +29,7 @@ public class IndicatorBottomFormMapper implements Serializable { private Integer formFieldId; - - - private Integer indicatorTopId; - - + @TableField(exist = false) + private String filedName; } diff --git a/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorEvalItem.java b/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorEvalItem.java index 717064a..85d56fb 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorEvalItem.java +++ b/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorEvalItem.java @@ -1,6 +1,7 @@ package com.hshh.indicator.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; @@ -32,27 +33,13 @@ public class IndicatorEvalItem implements Serializable { private Integer indicatorId; private Integer sortOrder; - @NotNull(message = "名称不能为空") @Size(max = 50, message = "名称不能超过50字符") private String evaluationName; + private String topValue; - @NotNull(message = "符号不能为空") - @Size(max = 5, message = "名称不能超过5字符") - private String minSymbol; - - @NotNull(message = "值不能为空") - @Size(max = 10, message = "值不能超过10字符") - private String minValue; - - @NotNull(message = "符号不能为空") - @Size(max = 5, message = "名称不能超过5字符") - private String maxSymbol; - - @NotNull(message = "值不能为空") - @Size(max = 10, message = "值不能超过10字符") - private String maxValue; - @NotNull(message = "值不能为空") - private Double grade; + private String bottomValue; + //除去范围外,等于某个字符串值 + private String equalValue; } diff --git a/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorFormMapper.java b/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorFormMapper.java index ef37008..fda676d 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorFormMapper.java +++ b/manager-admin/src/main/java/com/hshh/indicator/entity/IndicatorFormMapper.java @@ -1,6 +1,7 @@ package com.hshh.indicator.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; @@ -27,4 +28,5 @@ public class IndicatorFormMapper implements Serializable { + } diff --git a/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorBottomCsvMapperMapper.java b/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorBottomCsvMapperMapper.java index 1209401..8bb4eb1 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorBottomCsvMapperMapper.java +++ b/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorBottomCsvMapperMapper.java @@ -1,7 +1,8 @@ package com.hshh.indicator.mapper; -import com.hshh.indicator.entity.IndicatorBottomCsvMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hshh.indicator.entity.IndicatorBottomCsvMapper; +import java.util.List; /** *

@@ -13,4 +14,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface IndicatorBottomCsvMapperMapper extends BaseMapper { + /** + * 根据根指标查找对应关系. + * + * @param indicatorTopId 根指标 + * @return 对应关系列表 + */ + List selectByIndicatorTopId(Integer indicatorTopId); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorBottomMapperMapper.java b/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorBottomMapperMapper.java index 0a9b144..81ab222 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorBottomMapperMapper.java +++ b/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorBottomMapperMapper.java @@ -1,11 +1,12 @@ package com.hshh.indicator.mapper; -import com.hshh.indicator.entity.IndicatorBottomFormMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hshh.indicator.entity.IndicatorBottomFormMapper; +import java.util.List; /** *

- * Mapper 接口 + * Mapper 接口 *

* * @author liDongYu @@ -13,5 +14,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface IndicatorBottomMapperMapper extends BaseMapper { + /** + * 查找指标ID和字段名称的对应关系. + * + * @param topId 根指标ID + * @return 对应关系列表 + */ + List selectByIndicatorTopId(Integer topId); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomCsvMapperService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomCsvMapperService.java index 1299246..0e6f818 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomCsvMapperService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomCsvMapperService.java @@ -27,4 +27,12 @@ public interface IndicatorBottomCsvMapperService extends IService selectIndicatorToFieldNameListByIndicatorTopId(Integer topId); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomFormMapperService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomFormMapperService.java index 16f9ef5..bfdd3fb 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomFormMapperService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomFormMapperService.java @@ -34,4 +34,11 @@ public interface IndicatorBottomFormMapperService extends IService indicatorBottomFormMapperList); + /** + * 查找指标ID和字段名称的对应关系. + * + * @param topId 根指标ID + * @return 对应关系列表 + */ + List selectIndicatorToFieldNameListByIndicatorTopId(Integer topId); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorEvalItemService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorEvalItemService.java index 7fcb040..cc692b3 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorEvalItemService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorEvalItemService.java @@ -1,7 +1,7 @@ package com.hshh.indicator.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.hshh.evaluation.bean.EvalItemToFieldInfo; +import com.hshh.indicator.bean.IndicatorEvalBean; import com.hshh.indicator.entity.IndicatorEvalItem; import java.util.List; import java.util.Map; @@ -15,35 +15,18 @@ import java.util.Map; public interface IndicatorEvalItemService extends IService { /** - * 根据指标ID和名称查询记录. + * 根据顶级指标查询返回以子指标为key,value为子指标评价范围集合. * - * @param indicatorId 指标ID - * @param name 名称 - * @return 记录 + * @param indicatorTopId 顶级指标 + * @return 以子指标分类的评价集范围 */ - List queryListByNameAndIndicatorId(Integer indicatorId, String name); + Map> getIndicatorEvalItemMapByIndicatorTopId( + Integer indicatorTopId); /** - * 根据子指标查询他的评价集. + * 保存评价集 * - * @param indicatorId 子指标 - * @return 评价集 + * @param data 前端数据 */ - List queryListByIndicatorId(Integer indicatorId); - - /** - * 查询数据类型为从数据库读取的字段评价集及权重. - * - * @param indicatorTopId 指标顶级ID - * @return 对应map key为字段名称 - */ - Map evalMapForDatabaseTypeData(Integer indicatorTopId); - - /** - * 查询数据类型为从csv读取的字段评价集及权重. - * - * @param indicatorTopId 指标顶级ID - * @return 对应map key为字段名称 - */ - Map evalMapForCsvType(Integer indicatorTopId); + void saveWhole(IndicatorEvalBean data); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomCsvMapperServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomCsvMapperServiceImpl.java index ca73c3e..c0f5b88 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomCsvMapperServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomCsvMapperServiceImpl.java @@ -39,4 +39,10 @@ public class IndicatorBottomCsvMapperServiceImpl extends queryWrapper.eq("indicator_top_id", indicatorTopId); remove(queryWrapper); } + + @Override + public List selectIndicatorToFieldNameListByIndicatorTopId( + Integer topId) { + return this.baseMapper.selectByIndicatorTopId(topId); + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomMapperServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomMapperServiceImpl.java index 3a37aca..862f24e 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomMapperServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomMapperServiceImpl.java @@ -41,4 +41,9 @@ public class IndicatorBottomMapperServiceImpl extends public void saveMapper(List indicatorBottomFormMapperList) { indicatorBottomFormMapperList.forEach(this::save); } + + @Override + public List selectIndicatorToFieldNameListByIndicatorTopId(Integer topId) { + return this.baseMapper.selectByIndicatorTopId(topId); + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorEvalItemServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorEvalItemServiceImpl.java index 6214a8a..8e67976 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorEvalItemServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorEvalItemServiceImpl.java @@ -2,13 +2,18 @@ package com.hshh.indicator.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.hshh.evaluation.bean.EvalItemToFieldInfo; +import com.hshh.indicator.bean.IndicatorEvalBean; import com.hshh.indicator.entity.IndicatorEvalItem; import com.hshh.indicator.mapper.IndicatorEvalItemMapper; import com.hshh.indicator.service.IndicatorEvalItemService; +import com.hshh.indicator.service.IndicatorTopLevelService; +import com.hshh.indicator.service.IndicatorTopSetService; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; +import javax.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * 指标规则表 服务实现类. @@ -20,36 +25,31 @@ import org.springframework.stereotype.Service; public class IndicatorEvalItemServiceImpl extends ServiceImpl implements IndicatorEvalItemService { + + @Override - public List queryListByNameAndIndicatorId(Integer indicatorId, String name) { + public Map> getIndicatorEvalItemMapByIndicatorTopId( + Integer indicatorTopId) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("indicator_id", indicatorId); - queryWrapper.eq("evaluation_name", name); + queryWrapper.eq("indicator_top_id", indicatorTopId); + queryWrapper.orderByAsc("id"); + List indicatorEvalItemList = this.list(queryWrapper); - return this.list(queryWrapper); + return indicatorEvalItemList.stream() + .collect(Collectors.groupingBy(IndicatorEvalItem::getIndicatorId)); } + @Transactional(rollbackFor = Exception.class) @Override - public List queryListByIndicatorId(Integer indicatorId) { + public void saveWhole(IndicatorEvalBean data) { + //保存评价集 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("indicator_id", indicatorId); - queryWrapper.orderByAsc("sort_order", "id"); + queryWrapper.eq("indicator_top_id", data.getIndicatorTopId()); + remove(queryWrapper); + data.getEvalItemList().forEach(item -> { + item.setIndicatorTopId(data.getIndicatorTopId()); + save(item); + }); - return this.list(queryWrapper); } - - @Override - public Map evalMapForDatabaseTypeData(Integer indicatorTopId) { - - return Map.of(); - } - - @Override - public Map evalMapForCsvType(Integer indicatorTopId) { - - return Map.of(); - } - - - } diff --git a/manager-admin/src/main/java/com/hshh/model/mapper/FormValueMapper.java b/manager-admin/src/main/java/com/hshh/model/mapper/FormValueMapper.java index a3596dc..96a6e2a 100644 --- a/manager-admin/src/main/java/com/hshh/model/mapper/FormValueMapper.java +++ b/manager-admin/src/main/java/com/hshh/model/mapper/FormValueMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hshh.model.entity.FormValue; import com.hshh.system.common.bean.PaginationBean; import java.util.List; +import org.apache.ibatis.annotations.Param; /** * 动态表单实际对象记录表 Mapper 接口. @@ -28,4 +29,12 @@ public interface FormValueMapper extends BaseMapper { * @return 查询结果 */ Long count(PaginationBean request); + + /** + * 查询指定id的记录. + * + * @param ids id集合 + * @return 结果列表 + */ + List selectByIds(@Param("ids") List ids); } diff --git a/manager-admin/src/main/java/com/hshh/model/service/FormValueService.java b/manager-admin/src/main/java/com/hshh/model/service/FormValueService.java index 2789284..ec7022e 100644 --- a/manager-admin/src/main/java/com/hshh/model/service/FormValueService.java +++ b/manager-admin/src/main/java/com/hshh/model/service/FormValueService.java @@ -12,6 +12,7 @@ import java.util.List; * @since 2025-08-01 */ public interface FormValueService extends IService { + /** * 查询列表. * @@ -27,4 +28,12 @@ public interface FormValueService extends IService { * @return 查询结果 */ Long count(PaginationBean request); + + /** + * 查询指定id的记录. + * + * @param ids id集合 + * @return 结果列表 + */ + List selectByIds(List ids); } diff --git a/manager-admin/src/main/java/com/hshh/model/service/impl/FormValueServiceImpl.java b/manager-admin/src/main/java/com/hshh/model/service/impl/FormValueServiceImpl.java index 60f18af..f19410d 100644 --- a/manager-admin/src/main/java/com/hshh/model/service/impl/FormValueServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/model/service/impl/FormValueServiceImpl.java @@ -27,4 +27,9 @@ public class FormValueServiceImpl extends ServiceImpl selectByIds(List ids) { + return this.baseMapper.selectByIds(ids); + } } diff --git a/manager-admin/src/main/java/com/hshh/thread/HandleCmdThread.java b/manager-admin/src/main/java/com/hshh/thread/HandleEvaluationCmdThread.java similarity index 84% rename from manager-admin/src/main/java/com/hshh/thread/HandleCmdThread.java rename to manager-admin/src/main/java/com/hshh/thread/HandleEvaluationCmdThread.java index 61b9661..8bccd87 100644 --- a/manager-admin/src/main/java/com/hshh/thread/HandleCmdThread.java +++ b/manager-admin/src/main/java/com/hshh/thread/HandleEvaluationCmdThread.java @@ -1,7 +1,7 @@ package com.hshh.thread; import com.alibaba.fastjson2.JSON; -import com.hshh.evaluation.bean.EvaluationRequest; +import com.hshh.evaluation.bean.PageEvaluationRequest; import com.hshh.evaluation.service.impl.EvaluationProjectServiceImpl; import com.hshh.system.Global; import com.hshh.system.common.bean.SpringContextHolder; @@ -17,7 +17,7 @@ import lombok.extern.slf4j.Slf4j; * @since 2025/7/22 */ @Slf4j -public class HandleCmdThread implements Runnable { +public class HandleEvaluationCmdThread implements Runnable { @Override public void run() { @@ -39,6 +39,6 @@ public class HandleCmdThread implements Runnable { SpringContextHolder.getBean(EvaluationProjectServiceImpl.class) .evaluate(JSON.parseObject(cmd.getCmd(), - EvaluationRequest.class), cmd.getUserId()); + PageEvaluationRequest.class), cmd.getUserId()); } } diff --git a/manager-admin/src/main/resources/application.yaml b/manager-admin/src/main/resources/application.yaml index 6dcbe8b..dd34e14 100644 --- a/manager-admin/src/main/resources/application.yaml +++ b/manager-admin/src/main/resources/application.yaml @@ -22,15 +22,17 @@ spring: max-request-size: 20MB + mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml configuration: database-id: mysql -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto + diff --git a/manager-admin/src/main/resources/mapper/EvaluationCsvDataMapper.xml b/manager-admin/src/main/resources/mapper/EvaluationCsvDataMapper.xml index a0e2129..488dcd3 100644 --- a/manager-admin/src/main/resources/mapper/EvaluationCsvDataMapper.xml +++ b/manager-admin/src/main/resources/mapper/EvaluationCsvDataMapper.xml @@ -1,5 +1,72 @@ + + + + + diff --git a/manager-admin/src/main/resources/mapper/EvaluationHistoryMapper.xml b/manager-admin/src/main/resources/mapper/EvaluationHistoryMapper.xml index 1906d1b..0b92716 100644 --- a/manager-admin/src/main/resources/mapper/EvaluationHistoryMapper.xml +++ b/manager-admin/src/main/resources/mapper/EvaluationHistoryMapper.xml @@ -1,5 +1,12 @@ - + - + diff --git a/manager-admin/src/main/resources/mapper/EvaluationResultMapper.xml b/manager-admin/src/main/resources/mapper/EvaluationResultMapper.xml deleted file mode 100644 index 11ddaef..0000000 --- a/manager-admin/src/main/resources/mapper/EvaluationResultMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/manager-admin/src/main/resources/mapper/FormValueMapper.xml b/manager-admin/src/main/resources/mapper/FormValueMapper.xml index 71c326e..dc550a8 100644 --- a/manager-admin/src/main/resources/mapper/FormValueMapper.xml +++ b/manager-admin/src/main/resources/mapper/FormValueMapper.xml @@ -9,8 +9,8 @@ FROM ( SELECT * FROM m_data_model_field_value - - and model_define_id = #{id} + + and model_define_id = #{businessKey} and model_data LIKE CONCAT('%',#{search},'%') @@ -29,8 +29,8 @@ a.* FROM m_data_model_field_value a - - and model_define_id = #{id} + + and model_define_id = #{businessKey} and model_data LIKE '%'||#{search}||'%' @@ -42,8 +42,8 @@ select count(id) from m_data_model_field_value - - and model_define_id = #{id} + + and model_define_id = #{businessKey} and (model_data LIKE CONCAT('%',#{search},'%')) + diff --git a/manager-admin/src/main/resources/mapper/IndicatorBottomCsvMapperMapper.xml b/manager-admin/src/main/resources/mapper/IndicatorBottomCsvMapperMapper.xml index 5905f96..07876dd 100644 --- a/manager-admin/src/main/resources/mapper/IndicatorBottomCsvMapperMapper.xml +++ b/manager-admin/src/main/resources/mapper/IndicatorBottomCsvMapperMapper.xml @@ -1,5 +1,14 @@ + diff --git a/manager-admin/src/main/resources/mapper/IndicatorBottomMapperMapper.xml b/manager-admin/src/main/resources/mapper/IndicatorBottomMapperMapper.xml index 24346b7..3b23cf0 100644 --- a/manager-admin/src/main/resources/mapper/IndicatorBottomMapperMapper.xml +++ b/manager-admin/src/main/resources/mapper/IndicatorBottomMapperMapper.xml @@ -2,5 +2,13 @@ - + diff --git a/manager-admin/src/main/resources/mapper/IndicatorFormMapperMapper.xml b/manager-admin/src/main/resources/mapper/IndicatorFormMapperMapper.xml index 6fb9bcd..8806f7a 100644 --- a/manager-admin/src/main/resources/mapper/IndicatorFormMapperMapper.xml +++ b/manager-admin/src/main/resources/mapper/IndicatorFormMapperMapper.xml @@ -5,4 +5,5 @@ select t.indicator_model_id from m_data_indicator_form t where t.indicator_top_id=#{topId} + diff --git a/manager-admin/src/main/resources/static/js/common/common.js b/manager-admin/src/main/resources/static/js/common/common.js index cddd3aa..1789d06 100644 --- a/manager-admin/src/main/resources/static/js/common/common.js +++ b/manager-admin/src/main/resources/static/js/common/common.js @@ -246,12 +246,18 @@ function _resetPageNoSearch() { //动态数据,动态表头,动态表格 header=map record=list(map) function _dynamic_next(form) { - + let pageNum = document.forms[form]["currentPage"].value; + document.forms[form]["currentPage"].value = parseInt(pageNum)+1; + dynamic_search(); } function _dynamic_pre(form) { - + let pageNum = document.forms[form]["currentPage"].value; + document.forms[form]["currentPage"].value = parseInt(pageNum)-1; + dynamic_search(); } function _dynamic_resetPageNoSearch(form){ + document.forms[form]["currentPage"].value = 1; + dynamic_search(); } @@ -408,4 +414,25 @@ function wsUrl(path) { const loc = window.location; // 当前页面的地址 const scheme = loc.protocol === "https:" ? "wss:" : "ws:"; return scheme + "//" + loc.host + path; +} +function formToQueryString(formId) { + const form = document.getElementById(formId); + const formData = new FormData(form); + const params = new URLSearchParams(); + + for (let [key, value] of formData.entries()) { + // 排除文件输入 + const field = form.elements[key]; + if (field && field.type === "file") continue; + + params.append(key, value); + } + + return params.toString(); // "key1=val1&key2=val2" +} +function encryptPassword(password, aesKeyFromBackend,aesIVFromBackend) { + var key = CryptoJS.enc.Hex.parse(aesKeyFromBackend); // 32字节 + var iv = CryptoJS.enc.Hex.parse(aesIVFromBackend); // 16字节 + + return CryptoJS.AES.encrypt(password, key, { iv: iv, mode: CryptoJS.mode.CBC }).toString(); } \ No newline at end of file diff --git a/manager-admin/src/main/resources/static/js/crypto-js.min.js b/manager-admin/src/main/resources/static/js/crypto-js.min.js new file mode 100644 index 0000000..fb96be7 --- /dev/null +++ b/manager-admin/src/main/resources/static/js/crypto-js.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports?module.exports=exports=e():"function"==typeof define&&define.amd?define([],e):t.CryptoJS=e()}(this,function(){var W,O,I,U,K,X,L,l,j,T,t,N,q,e,Z,V,G,J,Q,Y,$,t1,e1,r1,i1,o1,n1,s,s1,c1,a1,h1,l1,o,f1,r,d1,u1,n,c,a,h,f,d,i=function(h){var i;if("undefined"!=typeof window&&window.crypto&&(i=window.crypto),"undefined"!=typeof self&&self.crypto&&(i=self.crypto),!(i=!(i=!(i="undefined"!=typeof globalThis&&globalThis.crypto?globalThis.crypto:i)&&"undefined"!=typeof window&&window.msCrypto?window.msCrypto:i)&&"undefined"!=typeof global&&global.crypto?global.crypto:i)&&"function"==typeof require)try{i=require("crypto")}catch(t){}var r=Object.create||function(t){return e.prototype=t,t=new e,e.prototype=null,t};function e(){}var t={},o=t.lib={},n=o.Base={extend:function(t){var e=r(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),(e.init.prototype=e).$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},l=o.WordArray=n.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var e=this.words,r=t.words,i=this.sigBytes,o=t.sigBytes;if(this.clamp(),i%4)for(var n=0;n>>2]>>>24-n%4*8&255;e[i+n>>>2]|=s<<24-(i+n)%4*8}else for(var c=0;c>>2]=r[c>>>2];return this.sigBytes+=o,this},clamp:function(){var t=this.words,e=this.sigBytes;t[e>>>2]&=4294967295<<32-e%4*8,t.length=h.ceil(e/4)},clone:function(){var t=n.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-o%4*8&255;i.push((n>>>4).toString(16)),i.push((15&n).toString(16))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new l.init(r,e/2)}},a=s.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],o=0;o>>2]>>>24-o%4*8&255;i.push(String.fromCharCode(n))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new l.init(r,e)}},f=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(a.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return a.parse(unescape(encodeURIComponent(t)))}},d=o.BufferedBlockAlgorithm=n.extend({reset:function(){this._data=new l.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=f.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var e,r=this._data,i=r.words,o=r.sigBytes,n=this.blockSize,s=o/(4*n),c=(s=t?h.ceil(s):h.max((0|s)-this._minBufferSize,0))*n,t=h.min(4*c,o);if(c){for(var a=0;a>>2]|=t[i]<<24-i%4*8;I.call(this,r,e)}else I.apply(this,arguments)}).prototype=p),i),p1=u.lib.WordArray;function _1(t){return t<<8&4278255360|t>>>8&16711935}(u=u.enc).Utf16=u.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],o=0;o>>2]>>>16-o%4*8&65535;i.push(String.fromCharCode(n))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=t.charCodeAt(i)<<16-i%2*16;return p1.create(r,2*e)}},u.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],o=0;o>>2]>>>16-o%4*8&65535);i.push(String.fromCharCode(n))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=_1(t.charCodeAt(i)<<16-i%2*16);return p1.create(r,2*e)}},U=(p=i).lib.WordArray,p.enc.Base64={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=this._map,o=(t.clamp(),[]),n=0;n>>2]>>>24-n%4*8&255)<<16|(e[n+1>>>2]>>>24-(n+1)%4*8&255)<<8|e[n+2>>>2]>>>24-(n+2)%4*8&255,c=0;c<4&&n+.75*c>>6*(3-c)&63));var a=i.charAt(64);if(a)for(;o.length%4;)o.push(a);return o.join("")},parse:function(t){var e=t.length,r=this._map;if(!(i=this._reverseMap))for(var i=this._reverseMap=[],o=0;o>>6-u%4*2,s=s|n,f[d>>>2]|=s<<24-d%4*8,d++);return U.create(f,d)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},K=(u=i).lib.WordArray,u.enc.Base64url={stringify:function(t,e){for(var r=t.words,i=t.sigBytes,o=(e=void 0===e?!0:e)?this._safe_map:this._map,n=(t.clamp(),[]),s=0;s>>2]>>>24-s%4*8&255)<<16|(r[s+1>>>2]>>>24-(s+1)%4*8&255)<<8|r[s+2>>>2]>>>24-(s+2)%4*8&255,a=0;a<4&&s+.75*a>>6*(3-a)&63));var h=o.charAt(64);if(h)for(;n.length%4;)n.push(h);return n.join("")},parse:function(t,e){var r=t.length,i=(e=void 0===e?!0:e)?this._safe_map:this._map;if(!(o=this._reverseMap))for(var o=this._reverseMap=[],n=0;n>>6-u%4*2,c=c|s,f[d>>>2]|=c<<24-d%4*8,d++);return K.create(f,d)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",_safe_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"};for(var y1=Math,p=i,g1=(u=p.lib).WordArray,v1=u.Hasher,u=p.algo,A=[],B1=0;B1<64;B1++)A[B1]=4294967296*y1.abs(y1.sin(B1+1))|0;function z(t,e,r,i,o,n,s){t=t+(e&r|~e&i)+o+s;return(t<>>32-n)+e}function H(t,e,r,i,o,n,s){t=t+(e&i|r&~i)+o+s;return(t<>>32-n)+e}function C(t,e,r,i,o,n,s){t=t+(e^r^i)+o+s;return(t<>>32-n)+e}function R(t,e,r,i,o,n,s){t=t+(r^(e|~i))+o+s;return(t<>>32-n)+e}u=u.MD5=v1.extend({_doReset:function(){this._hash=new g1.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,o=t[i];t[i]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8)}var n=this._hash.words,s=t[e+0],c=t[e+1],a=t[e+2],h=t[e+3],l=t[e+4],f=t[e+5],d=t[e+6],u=t[e+7],p=t[e+8],_=t[e+9],y=t[e+10],g=t[e+11],v=t[e+12],B=t[e+13],w=t[e+14],k=t[e+15],x=z(n[0],S=n[1],m=n[2],b=n[3],s,7,A[0]),b=z(b,x,S,m,c,12,A[1]),m=z(m,b,x,S,a,17,A[2]),S=z(S,m,b,x,h,22,A[3]);x=z(x,S,m,b,l,7,A[4]),b=z(b,x,S,m,f,12,A[5]),m=z(m,b,x,S,d,17,A[6]),S=z(S,m,b,x,u,22,A[7]),x=z(x,S,m,b,p,7,A[8]),b=z(b,x,S,m,_,12,A[9]),m=z(m,b,x,S,y,17,A[10]),S=z(S,m,b,x,g,22,A[11]),x=z(x,S,m,b,v,7,A[12]),b=z(b,x,S,m,B,12,A[13]),m=z(m,b,x,S,w,17,A[14]),x=H(x,S=z(S,m,b,x,k,22,A[15]),m,b,c,5,A[16]),b=H(b,x,S,m,d,9,A[17]),m=H(m,b,x,S,g,14,A[18]),S=H(S,m,b,x,s,20,A[19]),x=H(x,S,m,b,f,5,A[20]),b=H(b,x,S,m,y,9,A[21]),m=H(m,b,x,S,k,14,A[22]),S=H(S,m,b,x,l,20,A[23]),x=H(x,S,m,b,_,5,A[24]),b=H(b,x,S,m,w,9,A[25]),m=H(m,b,x,S,h,14,A[26]),S=H(S,m,b,x,p,20,A[27]),x=H(x,S,m,b,B,5,A[28]),b=H(b,x,S,m,a,9,A[29]),m=H(m,b,x,S,u,14,A[30]),x=C(x,S=H(S,m,b,x,v,20,A[31]),m,b,f,4,A[32]),b=C(b,x,S,m,p,11,A[33]),m=C(m,b,x,S,g,16,A[34]),S=C(S,m,b,x,w,23,A[35]),x=C(x,S,m,b,c,4,A[36]),b=C(b,x,S,m,l,11,A[37]),m=C(m,b,x,S,u,16,A[38]),S=C(S,m,b,x,y,23,A[39]),x=C(x,S,m,b,B,4,A[40]),b=C(b,x,S,m,s,11,A[41]),m=C(m,b,x,S,h,16,A[42]),S=C(S,m,b,x,d,23,A[43]),x=C(x,S,m,b,_,4,A[44]),b=C(b,x,S,m,v,11,A[45]),m=C(m,b,x,S,k,16,A[46]),x=R(x,S=C(S,m,b,x,a,23,A[47]),m,b,s,6,A[48]),b=R(b,x,S,m,u,10,A[49]),m=R(m,b,x,S,w,15,A[50]),S=R(S,m,b,x,f,21,A[51]),x=R(x,S,m,b,v,6,A[52]),b=R(b,x,S,m,h,10,A[53]),m=R(m,b,x,S,y,15,A[54]),S=R(S,m,b,x,c,21,A[55]),x=R(x,S,m,b,p,6,A[56]),b=R(b,x,S,m,k,10,A[57]),m=R(m,b,x,S,d,15,A[58]),S=R(S,m,b,x,B,21,A[59]),x=R(x,S,m,b,l,6,A[60]),b=R(b,x,S,m,g,10,A[61]),m=R(m,b,x,S,a,15,A[62]),S=R(S,m,b,x,_,21,A[63]),n[0]=n[0]+x|0,n[1]=n[1]+S|0,n[2]=n[2]+m|0,n[3]=n[3]+b|0},_doFinalize:function(){for(var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes,o=(e[i>>>5]|=128<<24-i%32,y1.floor(r/4294967296)),o=(e[15+(64+i>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process(),this._hash),n=o.words,s=0;s<4;s++){var c=n[s];n[s]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return o},clone:function(){var t=v1.clone.call(this);return t._hash=this._hash.clone(),t}}),p.MD5=v1._createHelper(u),p.HmacMD5=v1._createHmacHelper(u),u=(p=i).lib,X=u.WordArray,L=u.Hasher,u=p.algo,l=[],u=u.SHA1=L.extend({_doReset:function(){this._hash=new X.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],o=r[1],n=r[2],s=r[3],c=r[4],a=0;a<80;a++){a<16?l[a]=0|t[e+a]:(h=l[a-3]^l[a-8]^l[a-14]^l[a-16],l[a]=h<<1|h>>>31);var h=(i<<5|i>>>27)+c+l[a];h+=a<20?1518500249+(o&n|~o&s):a<40?1859775393+(o^n^s):a<60?(o&n|o&s|n&s)-1894007588:(o^n^s)-899497514,c=s,s=n,n=o<<30|o>>>2,o=i,i=h}r[0]=r[0]+i|0,r[1]=r[1]+o|0,r[2]=r[2]+n|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=L.clone.call(this);return t._hash=this._hash.clone(),t}}),p.SHA1=L._createHelper(u),p.HmacSHA1=L._createHmacHelper(u);var w1=Math,p=i,k1=(u=p.lib).WordArray,x1=u.Hasher,u=p.algo,b1=[],m1=[];function S1(t){return 4294967296*(t-(0|t))|0}for(var A1=2,z1=0;z1<64;)!function(t){for(var e=w1.sqrt(t),r=2;r<=e;r++)if(!(t%r))return;return 1}(A1)||(z1<8&&(b1[z1]=S1(w1.pow(A1,.5))),m1[z1]=S1(w1.pow(A1,1/3)),z1++),A1++;var _=[],u=u.SHA256=x1.extend({_doReset:function(){this._hash=new k1.init(b1.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],o=r[1],n=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=0;f<64;f++){f<16?_[f]=0|t[e+f]:(d=_[f-15],u=_[f-2],_[f]=((d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3)+_[f-7]+((u<<15|u>>>17)^(u<<13|u>>>19)^u>>>10)+_[f-16]);var d=i&o^i&n^o&n,u=l+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&a^~c&h)+m1[f]+_[f],l=h,h=a,a=c,c=s+u|0,s=n,n=o,o=i,i=u+(((i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22))+d)|0}r[0]=r[0]+i|0,r[1]=r[1]+o|0,r[2]=r[2]+n|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0,r[5]=r[5]+a|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=w1.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=x1.clone.call(this);return t._hash=this._hash.clone(),t}}),p=(p.SHA256=x1._createHelper(u),p.HmacSHA256=x1._createHmacHelper(u),j=(p=i).lib.WordArray,u=p.algo,T=u.SHA256,u=u.SHA224=T.extend({_doReset:function(){this._hash=new j.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=T._doFinalize.call(this);return t.sigBytes-=4,t}}),p.SHA224=T._createHelper(u),p.HmacSHA224=T._createHmacHelper(u),i),H1=p.lib.Hasher,y=(u=p.x64).Word,C1=u.WordArray,u=p.algo;function g(){return y.create.apply(y,arguments)}for(var R1=[g(1116352408,3609767458),g(1899447441,602891725),g(3049323471,3964484399),g(3921009573,2173295548),g(961987163,4081628472),g(1508970993,3053834265),g(2453635748,2937671579),g(2870763221,3664609560),g(3624381080,2734883394),g(310598401,1164996542),g(607225278,1323610764),g(1426881987,3590304994),g(1925078388,4068182383),g(2162078206,991336113),g(2614888103,633803317),g(3248222580,3479774868),g(3835390401,2666613458),g(4022224774,944711139),g(264347078,2341262773),g(604807628,2007800933),g(770255983,1495990901),g(1249150122,1856431235),g(1555081692,3175218132),g(1996064986,2198950837),g(2554220882,3999719339),g(2821834349,766784016),g(2952996808,2566594879),g(3210313671,3203337956),g(3336571891,1034457026),g(3584528711,2466948901),g(113926993,3758326383),g(338241895,168717936),g(666307205,1188179964),g(773529912,1546045734),g(1294757372,1522805485),g(1396182291,2643833823),g(1695183700,2343527390),g(1986661051,1014477480),g(2177026350,1206759142),g(2456956037,344077627),g(2730485921,1290863460),g(2820302411,3158454273),g(3259730800,3505952657),g(3345764771,106217008),g(3516065817,3606008344),g(3600352804,1432725776),g(4094571909,1467031594),g(275423344,851169720),g(430227734,3100823752),g(506948616,1363258195),g(659060556,3750685593),g(883997877,3785050280),g(958139571,3318307427),g(1322822218,3812723403),g(1537002063,2003034995),g(1747873779,3602036899),g(1955562222,1575990012),g(2024104815,1125592928),g(2227730452,2716904306),g(2361852424,442776044),g(2428436474,593698344),g(2756734187,3733110249),g(3204031479,2999351573),g(3329325298,3815920427),g(3391569614,3928383900),g(3515267271,566280711),g(3940187606,3454069534),g(4118630271,4000239992),g(116418474,1914138554),g(174292421,2731055270),g(289380356,3203993006),g(460393269,320620315),g(685471733,587496836),g(852142971,1086792851),g(1017036298,365543100),g(1126000580,2618297676),g(1288033470,3409855158),g(1501505948,4234509866),g(1607167915,987167468),g(1816402316,1246189591)],D1=[],E1=0;E1<80;E1++)D1[E1]=g();u=u.SHA512=H1.extend({_doReset:function(){this._hash=new C1.init([new y.init(1779033703,4089235720),new y.init(3144134277,2227873595),new y.init(1013904242,4271175723),new y.init(2773480762,1595750129),new y.init(1359893119,2917565137),new y.init(2600822924,725511199),new y.init(528734635,4215389547),new y.init(1541459225,327033209)])},_doProcessBlock:function(W,O){for(var t=this._hash.words,e=t[0],r=t[1],i=t[2],o=t[3],n=t[4],s=t[5],c=t[6],t=t[7],I=e.high,a=e.low,U=r.high,h=r.low,K=i.high,l=i.low,X=o.high,f=o.low,L=n.high,d=n.low,j=s.high,u=s.low,T=c.high,p=c.low,N=t.high,_=t.low,y=I,g=a,v=U,B=h,w=K,k=l,q=X,x=f,b=L,m=d,Z=j,S=u,V=T,G=p,J=N,Q=_,A=0;A<80;A++)var z,H,C=D1[A],R=(A<16?(H=C.high=0|W[O+2*A],z=C.low=0|W[O+2*A+1]):(F=(P=D1[A-15]).high,P=P.low,M=(E=D1[A-2]).high,E=E.low,D=(R=D1[A-7]).high,R=R.low,$=(Y=D1[A-16]).high,H=(H=((F>>>1|P<<31)^(F>>>8|P<<24)^F>>>7)+D+((z=(D=(P>>>1|F<<31)^(P>>>8|F<<24)^(P>>>7|F<<25))+R)>>>0>>0?1:0))+((M>>>19|E<<13)^(M<<3|E>>>29)^M>>>6)+((z+=P=(E>>>19|M<<13)^(E<<3|M>>>29)^(E>>>6|M<<26))>>>0

>>0?1:0),z+=F=Y.low,C.high=H=H+$+(z>>>0>>0?1:0),C.low=z),b&Z^~b&V),D=m&S^~m&G,E=y&v^y&w^v&w,M=(g>>>28|y<<4)^(g<<30|y>>>2)^(g<<25|y>>>7),P=R1[A],Y=P.high,$=P.low,F=Q+((m>>>14|b<<18)^(m>>>18|b<<14)^(m<<23|b>>>9)),C=J+((b>>>14|m<<18)^(b>>>18|m<<14)^(b<<23|m>>>9))+(F>>>0>>0?1:0),t1=M+(g&B^g&k^B&k),J=V,Q=G,V=Z,G=S,Z=b,S=m,b=q+(C=C+R+((F=F+D)>>>0>>0?1:0)+Y+((F=F+$)>>>0<$>>>0?1:0)+H+((F=F+z)>>>0>>0?1:0))+((m=x+F|0)>>>0>>0?1:0)|0,q=w,x=k,w=v,k=B,v=y,B=g,y=C+(((y>>>28|g<<4)^(y<<30|g>>>2)^(y<<25|g>>>7))+E+(t1>>>0>>0?1:0))+((g=F+t1|0)>>>0>>0?1:0)|0;a=e.low=a+g,e.high=I+y+(a>>>0>>0?1:0),h=r.low=h+B,r.high=U+v+(h>>>0>>0?1:0),l=i.low=l+k,i.high=K+w+(l>>>0>>0?1:0),f=o.low=f+x,o.high=X+q+(f>>>0>>0?1:0),d=n.low=d+m,n.high=L+b+(d>>>0>>0?1:0),u=s.low=u+S,s.high=j+Z+(u>>>0>>0?1:0),p=c.low=p+G,c.high=T+V+(p>>>0>>0?1:0),_=t.low=_+Q,t.high=N+J+(_>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=H1.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32}),p.SHA512=H1._createHelper(u),p.HmacSHA512=H1._createHmacHelper(u),u=(p=i).x64,t=u.Word,N=u.WordArray,u=p.algo,q=u.SHA512,u=u.SHA384=q.extend({_doReset:function(){this._hash=new N.init([new t.init(3418070365,3238371032),new t.init(1654270250,914150663),new t.init(2438529370,812702999),new t.init(355462360,4144912697),new t.init(1731405415,4290775857),new t.init(2394180231,1750603025),new t.init(3675008525,1694076839),new t.init(1203062813,3204075428)])},_doFinalize:function(){var t=q._doFinalize.call(this);return t.sigBytes-=16,t}}),p.SHA384=q._createHelper(u),p.HmacSHA384=q._createHmacHelper(u);for(var M1=Math,p=i,P1=(u=p.lib).WordArray,F1=u.Hasher,W1=p.x64.Word,u=p.algo,O1=[],I1=[],U1=[],v=1,B=0,K1=0;K1<24;K1++){O1[v+5*B]=(K1+1)*(K1+2)/2%64;var X1=(2*v+3*B)%5;v=B%5,B=X1}for(v=0;v<5;v++)for(B=0;B<5;B++)I1[v+5*B]=B+(2*v+3*B)%5*5;for(var L1=1,j1=0;j1<24;j1++){for(var T1,N1=0,q1=0,Z1=0;Z1<7;Z1++)1&L1&&((T1=(1<>>32-e}function Y1(t){return"string"==typeof t?f1:o}function $1(t,e,r){var i,o=this._iv;o?(i=o,this._iv=void 0):i=this._prevBlock;for(var n=0;n>24&255)?(r=t>>8&255,i=255&t,255===(e=t>>16&255)?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t=(t+=e<<16)+(r<<8)+i):t+=1<<24,t}u=u.SHA3=F1.extend({cfg:F1.cfg.extend({outputLength:512}),_doReset:function(){for(var t=this._state=[],e=0;e<25;e++)t[e]=new W1.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(t,e){for(var r=this._state,i=this.blockSize/2,o=0;o>>24)|4278255360&(n<<24|n>>>8);(x=r[o]).high^=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),x.low^=n}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++)h^=(x=r[a+5*f]).high,l^=x.low;var d=D[a];d.high=h,d.low=l}for(a=0;a<5;a++)for(var u=D[(a+4)%5],p=D[(a+1)%5],_=p.high,p=p.low,h=u.high^(_<<1|p>>>31),l=u.low^(p<<1|_>>>31),f=0;f<5;f++)(x=r[a+5*f]).high^=h,x.low^=l;for(var y=1;y<25;y++){var g=(x=r[y]).high,v=x.low,B=O1[y],g=(l=B<32?(h=g<>>32-B,v<>>32-B):(h=v<>>64-B,g<>>64-B),D[I1[y]]);g.high=h,g.low=l}var w=D[0],k=r[0];w.high=k.high,w.low=k.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var x=r[y=a+5*f],b=D[y],m=D[(a+1)%5+5*f],S=D[(a+2)%5+5*f];x.high=b.high^~m.high&S.high,x.low=b.low^~m.low&S.low}x=r[0],w=U1[c];x.high^=w.high,x.low^=w.low}},_doFinalize:function(){for(var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize,o=(e[r>>>5]|=1<<24-r%32,e[(M1.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process(),this._state),r=this.cfg.outputLength/8,n=r/8,s=[],c=0;c>>24)|4278255360&(h<<24|h>>>8);s.push(16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)),s.push(h)}return new P1.init(s,r)},clone:function(){for(var t=F1.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}}),p.SHA3=F1._createHelper(u),p.HmacSHA3=F1._createHmacHelper(u),Math,u=(p=i).lib,e=u.WordArray,Z=u.Hasher,u=p.algo,V=e.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),G=e.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),J=e.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),Q=e.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),Y=e.create([0,1518500249,1859775393,2400959708,2840853838]),$=e.create([1352829926,1548603684,1836072691,2053994217,0]),u=u.RIPEMD160=Z.extend({_doReset:function(){this._hash=e.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,o=t[i];t[i]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8)}for(var n,s,c,a,h,l,f=this._hash.words,d=Y.words,u=$.words,p=V.words,_=G.words,y=J.words,g=Q.words,v=n=f[0],B=s=f[1],w=c=f[2],k=a=f[3],x=h=f[4],r=0;r<80;r+=1)l=(l=Q1(l=(l=n+t[e+p[r]]|0)+(r<16?(s^c^a)+d[0]:r<32?G1(s,c,a)+d[1]:r<48?((s|~c)^a)+d[2]:r<64?J1(s,c,a)+d[3]:(s^(c|~a))+d[4])|0,y[r]))+h|0,n=h,h=a,a=Q1(c,10),c=s,s=l,l=(l=Q1(l=(l=v+t[e+_[r]]|0)+(r<16?(B^(w|~k))+u[0]:r<32?J1(B,w,k)+u[1]:r<48?((B|~w)^k)+u[2]:r<64?G1(B,w,k)+u[3]:(B^w^k)+u[4])|0,g[r]))+x|0,v=x,x=k,k=Q1(w,10),w=B,B=l;l=f[1]+c+k|0,f[1]=f[2]+a+x|0,f[2]=f[3]+h+v|0,f[3]=f[4]+n+B|0,f[4]=f[0]+s+w|0,f[0]=l},_doFinalize:function(){for(var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes,i=(e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process(),this._hash),o=i.words,n=0;n<5;n++){var s=o[n];o[n]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}return i},clone:function(){var t=Z.clone.call(this);return t._hash=this._hash.clone(),t}}),p.RIPEMD160=Z._createHelper(u),p.HmacRIPEMD160=Z._createHmacHelper(u),u=(p=i).lib.Base,t1=p.enc.Utf8,p.algo.HMAC=u.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=t1.parse(e));for(var r=t.blockSize,i=4*r,t=((e=e.sigBytes>i?t.finalize(e):e).clamp(),this._oKey=e.clone()),e=this._iKey=e.clone(),o=t.words,n=e.words,s=0;s>>2];t.sigBytes-=e}},P.BlockCipher=h1.extend({cfg:h1.cfg.extend({mode:r,padding:u}),reset:function(){h1.reset.call(this);var t,e=this.cfg,r=e.iv,e=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=e.createEncryptor:(t=e.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(e,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),l1=P.CipherParams=p.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}}),r=(w.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,t=t.salt,t=t?s.create([1398893684,1701076831]).concat(t).concat(e):e;return t.toString(c1)},parse:function(t){var e,t=c1.parse(t),r=t.words;return 1398893684==r[0]&&1701076831==r[1]&&(e=s.create(r.slice(2,4)),r.splice(0,4),t.sigBytes-=16),l1.create({ciphertext:t,salt:e})}},o=P.SerializableCipher=p.extend({cfg:p.extend({format:r}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var o=t.createEncryptor(r,i),e=o.finalize(e),o=o.cfg;return l1.create({ciphertext:e,key:r,iv:o.iv,algorithm:t,mode:o.mode,padding:o.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),u=(w.kdf={}).OpenSSL={execute:function(t,e,r,i,o){i=i||s.random(8),o=(o?a1.create({keySize:e+r,hasher:o}):a1.create({keySize:e+r})).compute(t,i);t=s.create(o.words.slice(e),4*r);return o.sigBytes=4*e,l1.create({key:o,iv:t,salt:i})}},f1=P.PasswordBasedCipher=o.extend({cfg:o.cfg.extend({kdf:u}),encrypt:function(t,e,r,i){r=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize,i.salt,i.hasher),i.iv=r.iv,t=o.encrypt.call(this,t,e,r.key,i);return t.mixIn(r),t},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);r=i.kdf.execute(r,t.keySize,t.ivSize,e.salt,i.hasher);return i.iv=r.iv,o.decrypt.call(this,t,e,r.key,i)}})),i.mode.CFB=((p=i.lib.BlockCipherMode.extend()).Encryptor=p.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;t2.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),p.Decryptor=p.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,o=t.slice(e,e+i);t2.call(this,t,e,i,r),this._prevBlock=o}}),p),i.mode.CTR=(r=i.lib.BlockCipherMode.extend(),w=r.Encryptor=r.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,o=this._iv,n=this._counter,s=(o&&(n=this._counter=o.slice(0),this._iv=void 0),n.slice(0));r.encryptBlock(s,0),n[i-1]=n[i-1]+1|0;for(var c=0;c>>2]|=e<<24-r%4*8,t.sigBytes+=e},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},i.pad.Iso10126={pad:function(t,e){e*=4,e-=t.sigBytes%e;t.concat(i.lib.WordArray.random(e-1)).concat(i.lib.WordArray.create([e<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},i.pad.Iso97971={pad:function(t,e){t.concat(i.lib.WordArray.create([2147483648],1)),i.pad.ZeroPadding.pad(t,e)},unpad:function(t){i.pad.ZeroPadding.unpad(t),t.sigBytes--}},i.pad.ZeroPadding={pad:function(t,e){e*=4;t.clamp(),t.sigBytes+=e-(t.sigBytes%e||e)},unpad:function(t){for(var e=t.words,r=t.sigBytes-1,r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},i.pad.NoPadding={pad:function(){},unpad:function(){}},d1=(P=i).lib.CipherParams,u1=P.enc.Hex,P.format.Hex={stringify:function(t){return t.ciphertext.toString(u1)},parse:function(t){t=u1.parse(t);return d1.create({ciphertext:t})}};for(var w=i,p=w.lib.BlockCipher,u=w.algo,k=[],r2=[],i2=[],o2=[],n2=[],s2=[],c2=[],a2=[],h2=[],l2=[],x=[],b=0;b<256;b++)x[b]=b<128?b<<1:b<<1^283;for(var m=0,S=0,b=0;b<256;b++){var E=S^S<<1^S<<2^S<<3^S<<4,f2=(k[m]=E=E>>>8^255&E^99,x[r2[E]=m]),d2=x[f2],u2=x[d2],M=257*x[E]^16843008*E;i2[m]=M<<24|M>>>8,o2[m]=M<<16|M>>>16,n2[m]=M<<8|M>>>24,s2[m]=M,c2[E]=(M=16843009*u2^65537*d2^257*f2^16843008*m)<<24|M>>>8,a2[E]=M<<16|M>>>16,h2[E]=M<<8|M>>>24,l2[E]=M,m?(m=f2^x[x[x[u2^f2]]],S^=x[x[S]]):m=S=1}var p2=[0,1,2,4,8,16,32,64,128,27,54],u=u.AES=p.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),o=this._keySchedule=[],n=0;n>>24]<<24|k[a>>>16&255]<<16|k[a>>>8&255]<<8|k[255&a]):(a=k[(a=a<<8|a>>>24)>>>24]<<24|k[a>>>16&255]<<16|k[a>>>8&255]<<8|k[255&a],a^=p2[n/r|0]<<24),o[n]=o[n-r]^a);for(var s=this._invKeySchedule=[],c=0;c>>24]]^a2[k[a>>>16&255]]^h2[k[a>>>8&255]]^l2[k[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,i2,o2,n2,s2,k)},decryptBlock:function(t,e){var r=t[e+1],r=(t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,c2,a2,h2,l2,r2),t[e+1]);t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,o,n,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p>>24]^o[l>>>16&255]^n[f>>>8&255]^s[255&d]^r[u++],y=i[l>>>24]^o[f>>>16&255]^n[d>>>8&255]^s[255&h]^r[u++],g=i[f>>>24]^o[d>>>16&255]^n[h>>>8&255]^s[255&l]^r[u++],v=i[d>>>24]^o[h>>>16&255]^n[l>>>8&255]^s[255&f]^r[u++],h=_,l=y,f=g,d=v;_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],y=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],g=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],v=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=y,t[e+2]=g,t[e+3]=v},keySize:8}),P=(w.AES=p._createHelper(u),i),_2=(w=P.lib).WordArray,w=w.BlockCipher,p=P.algo,y2=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],g2=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],v2=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],B2=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],w2=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],k2=p.DES=w.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=y2[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var o=this._subKeys=[],n=0;n<16;n++){for(var s=o[n]=[],c=v2[n],r=0;r<24;r++)s[r/6|0]|=e[(g2[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(g2[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}for(var a=this._invSubKeys=[],r=0;r<16;r++)a[r]=o[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],x2.call(this,4,252645135),x2.call(this,16,65535),b2.call(this,2,858993459),b2.call(this,8,16711935),x2.call(this,1,1431655765);for(var i=0;i<16;i++){for(var o=r[i],n=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=B2[a][((s^o[a])&w2[a])>>>0];this._lBlock=s,this._rBlock=n^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,x2.call(this,1,1431655765),b2.call(this,8,16711935),b2.call(this,2,858993459),x2.call(this,16,65535),x2.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function x2(t,e){e=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=e,this._lBlock^=e<>>t^this._lBlock)&e;this._lBlock^=e,this._rBlock^=e<192.");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),t=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=k2.createEncryptor(_2.create(e)),this._des2=k2.createEncryptor(_2.create(r)),this._des3=k2.createEncryptor(_2.create(t))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2}),P.TripleDES=w._createHelper(p);var u=i,P=u.lib.StreamCipher,w=u.algo,m2=w.RC4=P.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],o=0;o<256;o++)i[o]=o;for(var o=0,n=0;o<256;o++){var s=o%r,s=e[s>>>2]>>>24-s%4*8&255,n=(n+i[o]+s)%256,s=i[o];i[o]=i[n],i[n]=s}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=S2.call(this)},keySize:8,ivSize:0});function S2(){for(var t=this._S,e=this._i,r=this._j,i=0,o=0;o<4;o++){var r=(r+t[e=(e+1)%256])%256,n=t[e];t[e]=t[r],t[r]=n,i|=t[(t[e]+t[r])%256]<<24-8*o}return this._i=e,this._j=r,i}function A2(){for(var t=this._X,e=this._C,r=0;r<8;r++)c[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],o=65535&i,n=i>>>16;a[r]=((o*o>>>17)+o*n>>>15)+n*n^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=a[0]+(a[7]<<16|a[7]>>>16)+(a[6]<<16|a[6]>>>16)|0,t[1]=a[1]+(a[0]<<8|a[0]>>>24)+a[7]|0,t[2]=a[2]+(a[1]<<16|a[1]>>>16)+(a[0]<<16|a[0]>>>16)|0,t[3]=a[3]+(a[2]<<8|a[2]>>>24)+a[1]|0,t[4]=a[4]+(a[3]<<16|a[3]>>>16)+(a[2]<<16|a[2]>>>16)|0,t[5]=a[5]+(a[4]<<8|a[4]>>>24)+a[3]|0,t[6]=a[6]+(a[5]<<16|a[5]>>>16)+(a[4]<<16|a[4]>>>16)|0,t[7]=a[7]+(a[6]<<8|a[6]>>>24)+a[5]|0}function z2(){for(var t=this._X,e=this._C,r=0;r<8;r++)f[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],o=65535&i,n=i>>>16;d[r]=((o*o>>>17)+o*n>>>15)+n*n^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=d[0]+(d[7]<<16|d[7]>>>16)+(d[6]<<16|d[6]>>>16)|0,t[1]=d[1]+(d[0]<<8|d[0]>>>24)+d[7]|0,t[2]=d[2]+(d[1]<<16|d[1]>>>16)+(d[0]<<16|d[0]>>>16)|0,t[3]=d[3]+(d[2]<<8|d[2]>>>24)+d[1]|0,t[4]=d[4]+(d[3]<<16|d[3]>>>16)+(d[2]<<16|d[2]>>>16)|0,t[5]=d[5]+(d[4]<<8|d[4]>>>24)+d[3]|0,t[6]=d[6]+(d[5]<<16|d[5]>>>16)+(d[4]<<16|d[4]>>>16)|0,t[7]=d[7]+(d[6]<<8|d[6]>>>24)+d[5]|0}u.RC4=P._createHelper(m2),w=w.RC4Drop=m2.extend({cfg:m2.cfg.extend({drop:192}),_doReset:function(){m2._doReset.call(this);for(var t=this.cfg.drop;0>>24)|4278255360&(t[r]<<24|t[r]>>>8);for(var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],o=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],r=this._b=0;r<4;r++)A2.call(this);for(r=0;r<8;r++)o[r]^=i[r+4&7];if(e){var e=e.words,n=e[0],e=e[1],n=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e=16711935&(e<<8|e>>>24)|4278255360&(e<<24|e>>>8),s=n>>>16|4294901760&e,c=e<<16|65535&n;o[0]^=n,o[1]^=s,o[2]^=e,o[3]^=c,o[4]^=n,o[5]^=s,o[6]^=e,o[7]^=c;for(r=0;r<4;r++)A2.call(this)}},_doProcessBlock:function(t,e){var r=this._X;A2.call(this),n[0]=r[0]^r[5]>>>16^r[3]<<16,n[1]=r[2]^r[7]>>>16^r[5]<<16,n[2]=r[4]^r[1]>>>16^r[7]<<16,n[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)n[i]=16711935&(n[i]<<8|n[i]>>>24)|4278255360&(n[i]<<24|n[i]>>>8),t[e+i]^=n[i]},blockSize:4,ivSize:2}),p.Rabbit=u._createHelper(P),p=(w=i).lib.StreamCipher,u=w.algo,h=[],f=[],d=[],u=u.RabbitLegacy=p.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],o=this._b=0;o<4;o++)z2.call(this);for(o=0;o<8;o++)i[o]^=r[o+4&7];if(e){var t=e.words,e=t[0],t=t[1],e=16711935&(e<<8|e>>>24)|4278255360&(e<<24|e>>>8),t=16711935&(t<<8|t>>>24)|4278255360&(t<<24|t>>>8),n=e>>>16|4294901760&t,s=t<<16|65535&e;i[0]^=e,i[1]^=n,i[2]^=t,i[3]^=s,i[4]^=e,i[5]^=n,i[6]^=t,i[7]^=s;for(o=0;o<4;o++)z2.call(this)}},_doProcessBlock:function(t,e){var r=this._X;z2.call(this),h[0]=r[0]^r[5]>>>16^r[3]<<16,h[1]=r[2]^r[7]>>>16^r[5]<<16,h[2]=r[4]^r[1]>>>16^r[7]<<16,h[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)h[i]=16711935&(h[i]<<8|h[i]>>>24)|4278255360&(h[i]<<24|h[i]>>>8),t[e+i]^=h[i]},blockSize:4,ivSize:2}),w.RabbitLegacy=p._createHelper(u);{w=(P=i).lib.BlockCipher,p=P.algo;const F=16,D2=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],E2=[[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946],[1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055],[3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504],[976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462]];var H2={pbox:[],sbox:[]};function C2(t,e){var r=t.sbox[0][e>>24&255]+t.sbox[1][e>>16&255];return r=(r^=t.sbox[2][e>>8&255])+t.sbox[3][255&e]}function R2(e,t,r){let i=t,o=r,n;for(let t=0;t=a&&(e=0);let r=0,i=0,o=0;for(let t=0;t + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ +!function(A,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(A="undefined"!=typeof globalThis?globalThis:A||self).html2canvas=e()}(this,function(){"use strict"; +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */var r=function(A,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(A,e){A.__proto__=e}||function(A,e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(A[t]=e[t])})(A,e)};function A(A,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=A}r(A,e),A.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}var h=function(){return(h=Object.assign||function(A){for(var e,t=1,r=arguments.length;ts[0]&&e[1]>10),s%1024+56320)),(B+1===t||16384>5],this.data[e=(e<<2)+(31&A)];if(A<=65535)return e=this.index[2048+(A-55296>>5)],this.data[e=(e<<2)+(31&A)];if(A>11)],e=this.index[e+=A>>5&63],this.data[e=(e<<2)+(31&A)];if(A<=1114111)return this.data[this.highValueIndex]}return this.errorValue},l);function l(A,e,t,r,B,n){this.initialValue=A,this.errorValue=e,this.highStart=t,this.highValueIndex=r,this.index=B,this.data=n}for(var C="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",u="undefined"==typeof Uint8Array?[]:new Uint8Array(256),F=0;F>4,i[o++]=(15&t)<<4|r>>2,i[o++]=(3&r)<<6|63&B;return n}(y="KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA=="),L=Array.isArray(m)?function(A){for(var e=A.length,t=[],r=0;r=this._value.length?-1:this._value[A]},XA.prototype.consumeUnicodeRangeToken=function(){for(var A=[],e=this.consumeCodePoint();lA(e)&&A.length<6;)A.push(e),e=this.consumeCodePoint();for(var t=!1;63===e&&A.length<6;)A.push(e),e=this.consumeCodePoint(),t=!0;if(t)return{type:30,start:parseInt(g.apply(void 0,A.map(function(A){return 63===A?48:A})),16),end:parseInt(g.apply(void 0,A.map(function(A){return 63===A?70:A})),16)};var r=parseInt(g.apply(void 0,A),16);if(45===this.peekCodePoint(0)&&lA(this.peekCodePoint(1))){this.consumeCodePoint();for(var e=this.consumeCodePoint(),B=[];lA(e)&&B.length<6;)B.push(e),e=this.consumeCodePoint();return{type:30,start:r,end:parseInt(g.apply(void 0,B),16)}}return{type:30,start:r,end:r}},XA.prototype.consumeIdentLikeToken=function(){var A=this.consumeName();return"url"===A.toLowerCase()&&40===this.peekCodePoint(0)?(this.consumeCodePoint(),this.consumeUrlToken()):40===this.peekCodePoint(0)?(this.consumeCodePoint(),{type:19,value:A}):{type:20,value:A}},XA.prototype.consumeUrlToken=function(){var A=[];if(this.consumeWhiteSpace(),-1===this.peekCodePoint(0))return{type:22,value:""};var e,t=this.peekCodePoint(0);if(39===t||34===t){t=this.consumeStringToken(this.consumeCodePoint());return 0===t.type&&(this.consumeWhiteSpace(),-1===this.peekCodePoint(0)||41===this.peekCodePoint(0))?(this.consumeCodePoint(),{type:22,value:t.value}):(this.consumeBadUrlRemnants(),xA)}for(;;){var r=this.consumeCodePoint();if(-1===r||41===r)return{type:22,value:g.apply(void 0,A)};if(CA(r))return this.consumeWhiteSpace(),-1===this.peekCodePoint(0)||41===this.peekCodePoint(0)?(this.consumeCodePoint(),{type:22,value:g.apply(void 0,A)}):(this.consumeBadUrlRemnants(),xA);if(34===r||39===r||40===r||(0<=(e=r)&&e<=8||11===e||14<=e&&e<=31||127===e))return this.consumeBadUrlRemnants(),xA;if(92===r){if(!hA(r,this.peekCodePoint(0)))return this.consumeBadUrlRemnants(),xA;A.push(this.consumeEscapedCodePoint())}else A.push(r)}},XA.prototype.consumeWhiteSpace=function(){for(;CA(this.peekCodePoint(0));)this.consumeCodePoint()},XA.prototype.consumeBadUrlRemnants=function(){for(;;){var A=this.consumeCodePoint();if(41===A||-1===A)return;hA(A,this.peekCodePoint(0))&&this.consumeEscapedCodePoint()}},XA.prototype.consumeStringSlice=function(A){for(var e="";0>8,r=255&A>>16,A=255&A>>24;return e<255?"rgba("+A+","+r+","+t+","+e/255+")":"rgb("+A+","+r+","+t+")"}function Qe(A,e){if(17===A.type)return A.number;if(16!==A.type)return 0;var t=3===e?1:255;return 3===e?A.number/100*t:Math.round(A.number/100*t)}var ce=function(A,e){return 11===e&&12===A.type||(28===e&&29===A.type||2===e&&3===A.type)},ae={type:17,number:0,flags:4},ge={type:16,number:50,flags:4},we={type:16,number:100,flags:4},Ue=function(A,e){if(16===A.type)return A.number/100*e;if(WA(A))switch(A.unit){case"rem":case"em":return 16*A.number;default:return A.number}return A.number},le=function(A,e){if(15===e.type)switch(e.unit){case"deg":return Math.PI*e.number/180;case"grad":return Math.PI/200*e.number;case"rad":return e.number;case"turn":return 2*Math.PI*e.number}throw new Error("Unsupported angle type")},Ce=function(A){return Math.PI*A/180},ue=function(A,e){if(18===e.type){var t=me[e.name];if(void 0===t)throw new Error('Attempting to parse an unsupported color function "'+e.name+'"');return t(A,e.values)}if(5===e.type){if(3===e.value.length){var r=e.value.substring(0,1),B=e.value.substring(1,2),n=e.value.substring(2,3);return Fe(parseInt(r+r,16),parseInt(B+B,16),parseInt(n+n,16),1)}if(4===e.value.length){var r=e.value.substring(0,1),B=e.value.substring(1,2),n=e.value.substring(2,3),s=e.value.substring(3,4);return Fe(parseInt(r+r,16),parseInt(B+B,16),parseInt(n+n,16),parseInt(s+s,16)/255)}if(6===e.value.length){r=e.value.substring(0,2),B=e.value.substring(2,4),n=e.value.substring(4,6);return Fe(parseInt(r,16),parseInt(B,16),parseInt(n,16),1)}if(8===e.value.length){r=e.value.substring(0,2),B=e.value.substring(2,4),n=e.value.substring(4,6),s=e.value.substring(6,8);return Fe(parseInt(r,16),parseInt(B,16),parseInt(n,16),parseInt(s,16)/255)}}if(20===e.type){e=Le[e.value.toUpperCase()];if(void 0!==e)return e}return Le.TRANSPARENT},Fe=function(A,e,t,r){return(A<<24|e<<16|t<<8|Math.round(255*r)<<0)>>>0},he=function(A,e){e=e.filter($A);if(3===e.length){var t=e.map(Qe),r=t[0],B=t[1],t=t[2];return Fe(r,B,t,1)}if(4!==e.length)return 0;e=e.map(Qe),r=e[0],B=e[1],t=e[2],e=e[3];return Fe(r,B,t,e)};function de(A,e,t){return t<0&&(t+=1),1<=t&&--t,t<1/6?(e-A)*t*6+A:t<.5?e:t<2/3?6*(e-A)*(2/3-t)+A:A}function fe(A,e){return ue(A,JA.create(e).parseComponentValue())}function He(A,e){return A=ue(A,e[0]),(e=e[1])&&te(e)?{color:A,stop:e}:{color:A,stop:null}}function pe(A,t){var e=A[0],r=A[A.length-1];null===e.stop&&(e.stop=ae),null===r.stop&&(r.stop=we);for(var B=[],n=0,s=0;sA.optimumDistance)?{optimumCorner:e,optimumDistance:r}:A},{optimumDistance:s?1/0:-1/0,optimumCorner:null}).optimumCorner}var Ke=function(A,e){var t=e.filter($A),r=t[0],B=t[1],n=t[2],e=t[3],t=(17===r.type?Ce(r.number):le(A,r))/(2*Math.PI),A=te(B)?B.number/100:0,r=te(n)?n.number/100:0,B=void 0!==e&&te(e)?Ue(e,1):1;if(0==A)return Fe(255*r,255*r,255*r,1);n=r<=.5?r*(1+A):r+A-r*A,e=2*r-n,A=de(e,n,t+1/3),r=de(e,n,t),t=de(e,n,t-1/3);return Fe(255*A,255*r,255*t,B)},me={hsl:Ke,hsla:Ke,rgb:he,rgba:he},Le={ALICEBLUE:4042850303,ANTIQUEWHITE:4209760255,AQUA:16777215,AQUAMARINE:2147472639,AZURE:4043309055,BEIGE:4126530815,BISQUE:4293182719,BLACK:255,BLANCHEDALMOND:4293643775,BLUE:65535,BLUEVIOLET:2318131967,BROWN:2771004159,BURLYWOOD:3736635391,CADETBLUE:1604231423,CHARTREUSE:2147418367,CHOCOLATE:3530104575,CORAL:4286533887,CORNFLOWERBLUE:1687547391,CORNSILK:4294499583,CRIMSON:3692313855,CYAN:16777215,DARKBLUE:35839,DARKCYAN:9145343,DARKGOLDENROD:3095837695,DARKGRAY:2846468607,DARKGREEN:6553855,DARKGREY:2846468607,DARKKHAKI:3182914559,DARKMAGENTA:2332068863,DARKOLIVEGREEN:1433087999,DARKORANGE:4287365375,DARKORCHID:2570243327,DARKRED:2332033279,DARKSALMON:3918953215,DARKSEAGREEN:2411499519,DARKSLATEBLUE:1211993087,DARKSLATEGRAY:793726975,DARKSLATEGREY:793726975,DARKTURQUOISE:13554175,DARKVIOLET:2483082239,DEEPPINK:4279538687,DEEPSKYBLUE:12582911,DIMGRAY:1768516095,DIMGREY:1768516095,DODGERBLUE:512819199,FIREBRICK:2988581631,FLORALWHITE:4294635775,FORESTGREEN:579543807,FUCHSIA:4278255615,GAINSBORO:3705462015,GHOSTWHITE:4177068031,GOLD:4292280575,GOLDENROD:3668254975,GRAY:2155905279,GREEN:8388863,GREENYELLOW:2919182335,GREY:2155905279,HONEYDEW:4043305215,HOTPINK:4285117695,INDIANRED:3445382399,INDIGO:1258324735,IVORY:4294963455,KHAKI:4041641215,LAVENDER:3873897215,LAVENDERBLUSH:4293981695,LAWNGREEN:2096890111,LEMONCHIFFON:4294626815,LIGHTBLUE:2916673279,LIGHTCORAL:4034953471,LIGHTCYAN:3774873599,LIGHTGOLDENRODYELLOW:4210742015,LIGHTGRAY:3553874943,LIGHTGREEN:2431553791,LIGHTGREY:3553874943,LIGHTPINK:4290167295,LIGHTSALMON:4288707327,LIGHTSEAGREEN:548580095,LIGHTSKYBLUE:2278488831,LIGHTSLATEGRAY:2005441023,LIGHTSLATEGREY:2005441023,LIGHTSTEELBLUE:2965692159,LIGHTYELLOW:4294959359,LIME:16711935,LIMEGREEN:852308735,LINEN:4210091775,MAGENTA:4278255615,MAROON:2147483903,MEDIUMAQUAMARINE:1724754687,MEDIUMBLUE:52735,MEDIUMORCHID:3126187007,MEDIUMPURPLE:2473647103,MEDIUMSEAGREEN:1018393087,MEDIUMSLATEBLUE:2070474495,MEDIUMSPRINGGREEN:16423679,MEDIUMTURQUOISE:1221709055,MEDIUMVIOLETRED:3340076543,MIDNIGHTBLUE:421097727,MINTCREAM:4127193855,MISTYROSE:4293190143,MOCCASIN:4293178879,NAVAJOWHITE:4292783615,NAVY:33023,OLDLACE:4260751103,OLIVE:2155872511,OLIVEDRAB:1804477439,ORANGE:4289003775,ORANGERED:4282712319,ORCHID:3664828159,PALEGOLDENROD:4008225535,PALEGREEN:2566625535,PALETURQUOISE:2951671551,PALEVIOLETRED:3681588223,PAPAYAWHIP:4293907967,PEACHPUFF:4292524543,PERU:3448061951,PINK:4290825215,PLUM:3718307327,POWDERBLUE:2967529215,PURPLE:2147516671,REBECCAPURPLE:1714657791,RED:4278190335,ROSYBROWN:3163525119,ROYALBLUE:1097458175,SADDLEBROWN:2336560127,SALMON:4202722047,SANDYBROWN:4104413439,SEAGREEN:780883967,SEASHELL:4294307583,SIENNA:2689740287,SILVER:3233857791,SKYBLUE:2278484991,SLATEBLUE:1784335871,SLATEGRAY:1887473919,SLATEGREY:1887473919,SNOW:4294638335,SPRINGGREEN:16744447,STEELBLUE:1182971135,TAN:3535047935,TEAL:8421631,THISTLE:3636451583,TOMATO:4284696575,TRANSPARENT:0,TURQUOISE:1088475391,VIOLET:4001558271,WHEAT:4125012991,WHITE:4294967295,WHITESMOKE:4126537215,YELLOW:4294902015,YELLOWGREEN:2597139199},be={name:"background-clip",initialValue:"border-box",prefix:!1,type:1,parse:function(A,e){return e.map(function(A){if(_A(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0})}},De={name:"background-color",initialValue:"transparent",prefix:!1,type:3,format:"color"},Ke=function(t,A){var r=Ce(180),B=[];return Ae(A).forEach(function(A,e){if(0===e){e=A[0];if(20===e.type&&-1!==["top","left","right","bottom"].indexOf(e.value))return void(r=se(A));if(ne(e))return void(r=(le(t,e)+Ce(270))%Ce(360))}A=He(t,A);B.push(A)}),{angle:r,stops:B,type:1}},ve="closest-side",xe="farthest-side",Me="closest-corner",Se="farthest-corner",Te="ellipse",Ge="contain",he=function(r,A){var B=0,n=3,s=[],o=[];return Ae(A).forEach(function(A,e){var t=!0;0===e?t=A.reduce(function(A,e){if(_A(e))switch(e.value){case"center":return o.push(ge),!1;case"top":case"left":return o.push(ae),!1;case"right":case"bottom":return o.push(we),!1}else if(te(e)||ee(e))return o.push(e),!1;return A},t):1===e&&(t=A.reduce(function(A,e){if(_A(e))switch(e.value){case"circle":return B=0,!1;case Te:return!(B=1);case Ge:case ve:return n=0,!1;case xe:return!(n=1);case Me:return!(n=2);case"cover":case Se:return!(n=3)}else if(ee(e)||te(e))return(n=!Array.isArray(n)?[]:n).push(e),!1;return A},t)),t&&(A=He(r,A),s.push(A))}),{size:n,shape:B,stops:s,position:o,type:2}},Oe=function(A,e){if(22===e.type){var t={url:e.value,type:0};return A.cache.addImage(e.value),t}if(18!==e.type)throw new Error("Unsupported image type "+e.type);t=ke[e.name];if(void 0===t)throw new Error('Attempting to parse an unsupported image function "'+e.name+'"');return t(A,e.values)};var Ve,ke={"linear-gradient":function(t,A){var r=Ce(180),B=[];return Ae(A).forEach(function(A,e){if(0===e){e=A[0];if(20===e.type&&"to"===e.value)return void(r=se(A));if(ne(e))return void(r=le(t,e))}A=He(t,A);B.push(A)}),{angle:r,stops:B,type:1}},"-moz-linear-gradient":Ke,"-ms-linear-gradient":Ke,"-o-linear-gradient":Ke,"-webkit-linear-gradient":Ke,"radial-gradient":function(B,A){var n=0,s=3,o=[],i=[];return Ae(A).forEach(function(A,e){var t,r=!0;0===e&&(t=!1,r=A.reduce(function(A,e){if(t)if(_A(e))switch(e.value){case"center":return i.push(ge),A;case"top":case"left":return i.push(ae),A;case"right":case"bottom":return i.push(we),A}else(te(e)||ee(e))&&i.push(e);else if(_A(e))switch(e.value){case"circle":return n=0,!1;case Te:return!(n=1);case"at":return!(t=!0);case ve:return s=0,!1;case"cover":case xe:return!(s=1);case Ge:case Me:return!(s=2);case Se:return!(s=3)}else if(ee(e)||te(e))return(s=!Array.isArray(s)?[]:s).push(e),!1;return A},r)),r&&(A=He(B,A),o.push(A))}),{size:s,shape:n,stops:o,position:i,type:2}},"-moz-radial-gradient":he,"-ms-radial-gradient":he,"-o-radial-gradient":he,"-webkit-radial-gradient":he,"-webkit-gradient":function(r,A){var e=Ce(180),B=[],n=1;return Ae(A).forEach(function(A,e){var t,A=A[0];if(0===e){if(_A(A)&&"linear"===A.value)return void(n=1);if(_A(A)&&"radial"===A.value)return void(n=2)}18===A.type&&("from"===A.name?(t=ue(r,A.values[0]),B.push({stop:ae,color:t})):"to"===A.name?(t=ue(r,A.values[0]),B.push({stop:we,color:t})):"color-stop"!==A.name||2===(A=A.values.filter($A)).length&&(t=ue(r,A[1]),A=A[0],ZA(A)&&B.push({stop:{type:16,number:100*A.number,flags:A.flags},color:t})))}),1===n?{angle:(e+Ce(180))%Ce(360),stops:B,type:n}:{size:3,shape:0,stops:B,position:[],type:n}}},Re={name:"background-image",initialValue:"none",type:1,prefix:!1,parse:function(e,A){if(0===A.length)return[];var t=A[0];return 20===t.type&&"none"===t.value?[]:A.filter(function(A){return $A(A)&&!(20===(A=A).type&&"none"===A.value||18===A.type&&!ke[A.name])}).map(function(A){return Oe(e,A)})}},Ne={name:"background-origin",initialValue:"border-box",prefix:!1,type:1,parse:function(A,e){return e.map(function(A){if(_A(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0})}},Pe={name:"background-position",initialValue:"0% 0%",type:1,prefix:!1,parse:function(A,e){return Ae(e).map(function(A){return A.filter(te)}).map(re)}},Xe={name:"background-repeat",initialValue:"repeat",prefix:!1,type:1,parse:function(A,e){return Ae(e).map(function(A){return A.filter(_A).map(function(A){return A.value}).join(" ")}).map(Je)}},Je=function(A){switch(A){case"no-repeat":return 1;case"repeat-x":case"repeat no-repeat":return 2;case"repeat-y":case"no-repeat repeat":return 3;default:return 0}};(he=Ve=Ve||{}).AUTO="auto",he.CONTAIN="contain";function Ye(A,e){return _A(A)&&"normal"===A.value?1.2*e:17===A.type?e*A.number:te(A)?Ue(A,e):e}var We,Ze,_e={name:"background-size",initialValue:"0",prefix:!(he.COVER="cover"),type:1,parse:function(A,e){return Ae(e).map(function(A){return A.filter(qe)})}},qe=function(A){return _A(A)||te(A)},he=function(A){return{name:"border-"+A+"-color",initialValue:"transparent",prefix:!1,type:3,format:"color"}},je=he("top"),ze=he("right"),$e=he("bottom"),At=he("left"),he=function(A){return{name:"border-radius-"+A,initialValue:"0 0",prefix:!1,type:1,parse:function(A,e){return re(e.filter(te))}}},et=he("top-left"),tt=he("top-right"),rt=he("bottom-right"),Bt=he("bottom-left"),he=function(A){return{name:"border-"+A+"-style",initialValue:"solid",prefix:!1,type:2,parse:function(A,e){switch(e){case"none":return 0;case"dashed":return 2;case"dotted":return 3;case"double":return 4}return 1}}},nt=he("top"),st=he("right"),ot=he("bottom"),it=he("left"),he=function(A){return{name:"border-"+A+"-width",initialValue:"0",type:0,prefix:!1,parse:function(A,e){return WA(e)?e.number:0}}},Qt=he("top"),ct=he("right"),at=he("bottom"),gt=he("left"),wt={name:"color",initialValue:"transparent",prefix:!1,type:3,format:"color"},Ut={name:"direction",initialValue:"ltr",prefix:!1,type:2,parse:function(A,e){return"rtl"!==e?0:1}},lt={name:"display",initialValue:"inline-block",prefix:!1,type:1,parse:function(A,e){return e.filter(_A).reduce(function(A,e){return A|Ct(e.value)},0)}},Ct=function(A){switch(A){case"block":case"-webkit-box":return 2;case"inline":return 4;case"run-in":return 8;case"flow":return 16;case"flow-root":return 32;case"table":return 64;case"flex":case"-webkit-flex":return 128;case"grid":case"-ms-grid":return 256;case"ruby":return 512;case"subgrid":return 1024;case"list-item":return 2048;case"table-row-group":return 4096;case"table-header-group":return 8192;case"table-footer-group":return 16384;case"table-row":return 32768;case"table-cell":return 65536;case"table-column-group":return 131072;case"table-column":return 262144;case"table-caption":return 524288;case"ruby-base":return 1048576;case"ruby-text":return 2097152;case"ruby-base-container":return 4194304;case"ruby-text-container":return 8388608;case"contents":return 16777216;case"inline-block":return 33554432;case"inline-list-item":return 67108864;case"inline-table":return 134217728;case"inline-flex":return 268435456;case"inline-grid":return 536870912}return 0},ut={name:"float",initialValue:"none",prefix:!1,type:2,parse:function(A,e){switch(e){case"left":return 1;case"right":return 2;case"inline-start":return 3;case"inline-end":return 4}return 0}},Ft={name:"letter-spacing",initialValue:"0",prefix:!1,type:0,parse:function(A,e){return!(20===e.type&&"normal"===e.value||17!==e.type&&15!==e.type)?e.number:0}},ht={name:"line-break",initialValue:(he=We=We||{}).NORMAL="normal",prefix:!(he.STRICT="strict"),type:2,parse:function(A,e){return"strict"!==e?We.NORMAL:We.STRICT}},dt={name:"line-height",initialValue:"normal",prefix:!1,type:4},ft={name:"list-style-image",initialValue:"none",type:0,prefix:!1,parse:function(A,e){return 20===e.type&&"none"===e.value?null:Oe(A,e)}},Ht={name:"list-style-position",initialValue:"outside",prefix:!1,type:2,parse:function(A,e){return"inside"!==e?1:0}},pt={name:"list-style-type",initialValue:"none",prefix:!1,type:2,parse:function(A,e){switch(e){case"disc":return 0;case"circle":return 1;case"square":return 2;case"decimal":return 3;case"cjk-decimal":return 4;case"decimal-leading-zero":return 5;case"lower-roman":return 6;case"upper-roman":return 7;case"lower-greek":return 8;case"lower-alpha":return 9;case"upper-alpha":return 10;case"arabic-indic":return 11;case"armenian":return 12;case"bengali":return 13;case"cambodian":return 14;case"cjk-earthly-branch":return 15;case"cjk-heavenly-stem":return 16;case"cjk-ideographic":return 17;case"devanagari":return 18;case"ethiopic-numeric":return 19;case"georgian":return 20;case"gujarati":return 21;case"gurmukhi":case"hebrew":return 22;case"hiragana":return 23;case"hiragana-iroha":return 24;case"japanese-formal":return 25;case"japanese-informal":return 26;case"kannada":return 27;case"katakana":return 28;case"katakana-iroha":return 29;case"khmer":return 30;case"korean-hangul-formal":return 31;case"korean-hanja-formal":return 32;case"korean-hanja-informal":return 33;case"lao":return 34;case"lower-armenian":return 35;case"malayalam":return 36;case"mongolian":return 37;case"myanmar":return 38;case"oriya":return 39;case"persian":return 40;case"simp-chinese-formal":return 41;case"simp-chinese-informal":return 42;case"tamil":return 43;case"telugu":return 44;case"thai":return 45;case"tibetan":return 46;case"trad-chinese-formal":return 47;case"trad-chinese-informal":return 48;case"upper-armenian":return 49;case"disclosure-open":return 50;case"disclosure-closed":return 51;default:return-1}}},he=function(A){return{name:"margin-"+A,initialValue:"0",prefix:!1,type:4}},Et=he("top"),It=he("right"),yt=he("bottom"),Kt=he("left"),mt={name:"overflow",initialValue:"visible",prefix:!1,type:1,parse:function(A,e){return e.filter(_A).map(function(A){switch(A.value){case"hidden":return 1;case"scroll":return 2;case"clip":return 3;case"auto":return 4;default:return 0}})}},Lt={name:"overflow-wrap",initialValue:"normal",prefix:!1,type:2,parse:function(A,e){return"break-word"!==e?"normal":"break-word"}},he=function(A){return{name:"padding-"+A,initialValue:"0",prefix:!1,type:3,format:"length-percentage"}},bt=he("top"),Dt=he("right"),vt=he("bottom"),xt=he("left"),Mt={name:"text-align",initialValue:"left",prefix:!1,type:2,parse:function(A,e){switch(e){case"right":return 2;case"center":case"justify":return 1;default:return 0}}},St={name:"position",initialValue:"static",prefix:!1,type:2,parse:function(A,e){switch(e){case"relative":return 1;case"absolute":return 2;case"fixed":return 3;case"sticky":return 4}return 0}},Tt={name:"text-shadow",initialValue:"none",type:1,prefix:!1,parse:function(n,A){return 1===A.length&&jA(A[0],"none")?[]:Ae(A).map(function(A){for(var e={color:Le.TRANSPARENT,offsetX:ae,offsetY:ae,blur:ae},t=0,r=0;r>5],this.data[e=(e<<2)+(31&A)];if(A<=65535)return e=this.index[2048+(A-55296>>5)],this.data[e=(e<<2)+(31&A)];if(A>11)],e=this.index[e+=A>>5&63],this.data[e=(e<<2)+(31&A)];if(A<=1114111)return this.data[this.highValueIndex]}return this.errorValue},pr);function pr(A,e,t,r,B,n){this.initialValue=A,this.errorValue=e,this.highStart=t,this.highValueIndex=r,this.index=B,this.data=n}for(var Er="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Ir="undefined"==typeof Uint8Array?[]:new Uint8Array(256),yr=0;yr>10),s%1024+56320)),(B+1===t||16384>4,i[o++]=(15&t)<<4|r>>2,i[o++]=(3&r)<<6|63&B;return n}(br="AAAAAAAAAAAAEA4AGBkAAFAaAAACAAAAAAAIABAAGAAwADgACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAAQABIAEQATAAIABAACAAQAAgAEAAIABAAVABcAAgAEAAIABAACAAQAGAAaABwAHgAgACIAI4AlgAIABAAmwCjAKgAsAC2AL4AvQDFAMoA0gBPAVYBWgEIAAgACACMANoAYgFkAWwBdAF8AX0BhQGNAZUBlgGeAaMBlQGWAasBswF8AbsBwwF0AcsBYwHTAQgA2wG/AOMBdAF8AekB8QF0AfkB+wHiAHQBfAEIAAMC5gQIAAsCEgIIAAgAFgIeAggAIgIpAggAMQI5AkACygEIAAgASAJQAlgCYAIIAAgACAAKBQoFCgUTBRMFGQUrBSsFCAAIAAgACAAIAAgACAAIAAgACABdAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABoAmgCrwGvAQgAbgJ2AggAHgEIAAgACADnAXsCCAAIAAgAgwIIAAgACAAIAAgACACKAggAkQKZAggAPADJAAgAoQKkAqwCsgK6AsICCADJAggA0AIIAAgACAAIANYC3gIIAAgACAAIAAgACABAAOYCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAkASoB+QIEAAgACAA8AEMCCABCBQgACABJBVAFCAAIAAgACAAIAAgACAAIAAgACABTBVoFCAAIAFoFCABfBWUFCAAIAAgACAAIAAgAbQUIAAgACAAIAAgACABzBXsFfQWFBYoFigWKBZEFigWKBYoFmAWfBaYFrgWxBbkFCAAIAAgACAAIAAgACAAIAAgACAAIAMEFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAMgFCADQBQgACAAIAAgACAAIAAgACAAIAAgACAAIAO4CCAAIAAgAiQAIAAgACABAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAD0AggACAD8AggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIANYFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAMDvwAIAAgAJAIIAAgACAAIAAgACAAIAAgACwMTAwgACAB9BOsEGwMjAwgAKwMyAwsFYgE3A/MEPwMIAEUDTQNRAwgAWQOsAGEDCAAIAAgACAAIAAgACABpAzQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFIQUoBSwFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABtAwgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABMAEwACAAIAAgACAAIABgACAAIAAgACAC/AAgACAAyAQgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACAAIAAwAAgACAAIAAgACAAIAAgACAAIAAAARABIAAgACAAIABQASAAIAAgAIABwAEAAjgCIABsAqAC2AL0AigDQAtwC+IJIQqVAZUBWQqVAZUBlQGVAZUBlQGrC5UBlQGVAZUBlQGVAZUBlQGVAXsKlQGVAbAK6wsrDGUMpQzlDJUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAfAKAAuZA64AtwCJALoC6ADwAAgAuACgA/oEpgO6AqsD+AAIAAgAswMIAAgACAAIAIkAuwP5AfsBwwPLAwgACAAIAAgACADRA9kDCAAIAOED6QMIAAgACAAIAAgACADuA/YDCAAIAP4DyQAIAAgABgQIAAgAXQAOBAgACAAIAAgACAAIABMECAAIAAgACAAIAAgACAD8AAQBCAAIAAgAGgQiBCoECAExBAgAEAEIAAgACAAIAAgACAAIAAgACAAIAAgACAA4BAgACABABEYECAAIAAgATAQYAQgAVAQIAAgACAAIAAgACAAIAAgACAAIAFoECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAOQEIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAB+BAcACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEABhgSMBAgACAAIAAgAlAQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAwAEAAQABAADAAMAAwADAAQABAAEAAQABAAEAAQABHATAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAdQMIAAgACAAIAAgACAAIAMkACAAIAAgAfQMIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACFA4kDCAAIAAgACAAIAOcBCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAIcDCAAIAAgACAAIAAgACAAIAAgACAAIAJEDCAAIAAgACADFAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABgBAgAZgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAbAQCBXIECAAIAHkECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAJwEQACjBKoEsgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAC6BMIECAAIAAgACAAIAAgACABmBAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAxwQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAGYECAAIAAgAzgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBd0FXwUIAOIF6gXxBYoF3gT5BQAGCAaKBYoFigWKBYoFigWKBYoFigWKBYoFigXWBIoFigWKBYoFigWKBYoFigWKBYsFEAaKBYoFigWKBYoFigWKBRQGCACKBYoFigWKBQgACAAIANEECAAIABgGigUgBggAJgYIAC4GMwaKBYoF0wQ3Bj4GigWKBYoFigWKBYoFigWKBYoFigWKBYoFigUIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWLBf///////wQABAAEAAQABAAEAAQABAAEAAQAAwAEAAQAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAQADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUAAAAFAAUAAAAFAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAQAAAAUABQAFAAUABQAFAAAAAAAFAAUAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAFAAUAAQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAAABwAHAAcAAAAHAAcABwAFAAEAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAcABwAFAAUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQABAAAAAAAAAAAAAAAFAAUABQAFAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAHAAcAAAAHAAcAAAAAAAUABQAHAAUAAQAHAAEABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwABAAUABQAFAAUAAAAAAAAAAAAAAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABQANAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAABQAHAAUABQAFAAAAAAAAAAcABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUAAAAFAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAUAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAcABwAFAAcABwAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUABwAHAAUABQAFAAUAAAAAAAcABwAAAAAABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAAAAAAAAAAABQAFAAAAAAAFAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAFAAUABQAFAAUAAAAFAAUABwAAAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABwAFAAUABQAFAAAAAAAHAAcAAAAAAAcABwAFAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAAAAAAAAAHAAcABwAAAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAUABQAFAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAHAAcABQAHAAcAAAAFAAcABwAAAAcABwAFAAUAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAFAAcABwAFAAUABQAAAAUAAAAHAAcABwAHAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAHAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAUAAAAFAAUAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABwAFAAUABQAFAAUABQAAAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABQAFAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAFAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAHAAUABQAFAAUABQAFAAUABwAHAAcABwAHAAcABwAHAAUABwAHAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABwAHAAcABwAFAAUABwAHAAcAAAAAAAAAAAAHAAcABQAHAAcABwAHAAcABwAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAUABQAFAAUABQAFAAUAAAAFAAAABQAAAAAABQAFAAUABQAFAAUABQAFAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAUABQAFAAUABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABwAFAAcABwAHAAcABwAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAUABQAFAAUABwAHAAUABQAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABQAFAAcABwAHAAUABwAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAcABQAFAAUABQAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAAAAAABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAUABQAHAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAFAAUABQAFAAcABwAFAAUABwAHAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAcABwAFAAUABwAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABQAAAAAABQAFAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAcABwAAAAAAAAAAAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAcABwAFAAcABwAAAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAFAAUABQAAAAUABQAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABwAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAHAAcABQAHAAUABQAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAAABwAHAAAAAAAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAFAAUABwAFAAcABwAFAAcABQAFAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAAAAAABwAHAAcABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAFAAcABwAFAAUABQAFAAUABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAUABQAFAAcABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABQAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAAAAAAFAAUABwAHAAcABwAFAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAHAAUABQAFAAUABQAFAAUABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAABQAAAAUABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAHAAcAAAAFAAUAAAAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABQAFAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAABQAFAAUABQAFAAUABQAAAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAFAAUABQAFAAUADgAOAA4ADgAOAA4ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAAAAAAAAAAAAsADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwACwAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAADgAOAA4AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAAAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4AAAAOAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAAAAAAAAAAAA4AAAAOAAAAAAAAAAAADgAOAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAA="),xr=Array.isArray(vr)?function(A){for(var e=A.length,t=[],r=0;rs.x||t.y>s.y;return s=t,0===e||A});return A.body.removeChild(e),t}(document);return Object.defineProperty(Xr,"SUPPORT_WORD_BREAKING",{value:A}),A},get SUPPORT_SVG_DRAWING(){var A=function(A){var e=new Image,t=A.createElement("canvas"),A=t.getContext("2d");if(!A)return!1;e.src="data:image/svg+xml,";try{A.drawImage(e,0,0),t.toDataURL()}catch(A){return!1}return!0}(document);return Object.defineProperty(Xr,"SUPPORT_SVG_DRAWING",{value:A}),A},get SUPPORT_FOREIGNOBJECT_DRAWING(){var A="function"==typeof Array.from&&"function"==typeof window.fetch?function(t){var A=t.createElement("canvas"),r=100;A.width=r,A.height=r;var B=A.getContext("2d");if(!B)return Promise.reject(!1);B.fillStyle="rgb(0, 255, 0)",B.fillRect(0,0,r,r);var e=new Image,n=A.toDataURL();e.src=n;e=Nr(r,r,0,0,e);return B.fillStyle="red",B.fillRect(0,0,r,r),Pr(e).then(function(A){B.drawImage(A,0,0);var e=B.getImageData(0,0,r,r).data;B.fillStyle="red",B.fillRect(0,0,r,r);A=t.createElement("div");return A.style.backgroundImage="url("+n+")",A.style.height="100px",Lr(e)?Pr(Nr(r,r,0,0,A)):Promise.reject(!1)}).then(function(A){return B.drawImage(A,0,0),Lr(B.getImageData(0,0,r,r).data)}).catch(function(){return!1})}(document):Promise.resolve(!1);return Object.defineProperty(Xr,"SUPPORT_FOREIGNOBJECT_DRAWING",{value:A}),A},get SUPPORT_CORS_IMAGES(){var A=void 0!==(new Image).crossOrigin;return Object.defineProperty(Xr,"SUPPORT_CORS_IMAGES",{value:A}),A},get SUPPORT_RESPONSE_TYPE(){var A="string"==typeof(new XMLHttpRequest).responseType;return Object.defineProperty(Xr,"SUPPORT_RESPONSE_TYPE",{value:A}),A},get SUPPORT_CORS_XHR(){var A="withCredentials"in new XMLHttpRequest;return Object.defineProperty(Xr,"SUPPORT_CORS_XHR",{value:A}),A},get SUPPORT_NATIVE_TEXT_SEGMENTATION(){var A=!("undefined"==typeof Intl||!Intl.Segmenter);return Object.defineProperty(Xr,"SUPPORT_NATIVE_TEXT_SEGMENTATION",{value:A}),A}},Jr=function(A,e){this.text=A,this.bounds=e},Yr=function(A,e){var t=e.ownerDocument;if(t){var r=t.createElement("html2canvaswrapper");r.appendChild(e.cloneNode(!0));t=e.parentNode;if(t){t.replaceChild(r,e);A=f(A,r);return r.firstChild&&t.replaceChild(r.firstChild,r),A}}return d.EMPTY},Wr=function(A,e,t){var r=A.ownerDocument;if(!r)throw new Error("Node has no owner document");r=r.createRange();return r.setStart(A,e),r.setEnd(A,e+t),r},Zr=function(A){if(Xr.SUPPORT_NATIVE_TEXT_SEGMENTATION){var e=new Intl.Segmenter(void 0,{granularity:"grapheme"});return Array.from(e.segment(A)).map(function(A){return A.segment})}return function(A){for(var e,t=mr(A),r=[];!(e=t.next()).done;)e.value&&r.push(e.value.slice());return r}(A)},_r=function(A,e){return 0!==e.letterSpacing?Zr(A):function(A,e){if(Xr.SUPPORT_NATIVE_TEXT_SEGMENTATION){var t=new Intl.Segmenter(void 0,{granularity:"word"});return Array.from(t.segment(A)).map(function(A){return A.segment})}return jr(A,e)}(A,e)},qr=[32,160,4961,65792,65793,4153,4241],jr=function(A,e){for(var t,r=wA(A,{lineBreak:e.lineBreak,wordBreak:"break-word"===e.overflowWrap?"break-word":e.wordBreak}),B=[];!(t=r.next()).done;)!function(){var A,e;t.value&&(A=t.value.slice(),A=Q(A),e="",A.forEach(function(A){-1===qr.indexOf(A)?e+=g(A):(e.length&&B.push(e),B.push(g(A)),e="")}),e.length&&B.push(e))}();return B},zr=function(A,e,t){var B,n,s,o,i;this.text=$r(e.data,t.textTransform),this.textBounds=(B=A,A=this.text,s=e,A=_r(A,n=t),o=[],i=0,A.forEach(function(A){var e,t,r;n.textDecorationLine.length||0e.height?new d(e.left+(e.width-e.height)/2,e.top,e.height,e.height):e.width"),Ln(this.referenceElement.ownerDocument,t,n),o.replaceChild(o.adoptNode(this.documentElement),o.documentElement),o.close(),A},fn.prototype.createElementClone=function(A){if(Cr(A,2),zB(A))return this.createCanvasClone(A);if(MB(A))return this.createVideoClone(A);if(SB(A))return this.createStyleClone(A);var e=A.cloneNode(!1);return $B(e)&&($B(A)&&A.currentSrc&&A.currentSrc!==A.src&&(e.src=A.currentSrc,e.srcset=""),"lazy"===e.loading&&(e.loading="eager")),TB(e)?this.createCustomElementClone(e):e},fn.prototype.createCustomElementClone=function(A){var e=document.createElement("html2canvascustomelement");return Kn(A.style,e),e},fn.prototype.createStyleClone=function(A){try{var e=A.sheet;if(e&&e.cssRules){var t=[].slice.call(e.cssRules,0).reduce(function(A,e){return e&&"string"==typeof e.cssText?A+e.cssText:A},""),r=A.cloneNode(!1);return r.textContent=t,r}}catch(A){if(this.context.logger.error("Unable to access cssRules property",A),"SecurityError"!==A.name)throw A}return A.cloneNode(!1)},fn.prototype.createCanvasClone=function(e){var A;if(this.options.inlineImages&&e.ownerDocument){var t=e.ownerDocument.createElement("img");try{return t.src=e.toDataURL(),t}catch(A){this.context.logger.info("Unable to inline canvas contents, canvas is tainted",e)}}t=e.cloneNode(!1);try{t.width=e.width,t.height=e.height;var r,B,n=e.getContext("2d"),s=t.getContext("2d");return s&&(!this.options.allowTaint&&n?s.putImageData(n.getImageData(0,0,e.width,e.height),0,0):(!(r=null!==(A=e.getContext("webgl2"))&&void 0!==A?A:e.getContext("webgl"))||!1===(null==(B=r.getContextAttributes())?void 0:B.preserveDrawingBuffer)&&this.context.logger.warn("Unable to clone WebGL context as it has preserveDrawingBuffer=false",e),s.drawImage(e,0,0))),t}catch(A){this.context.logger.info("Unable to clone canvas as it is tainted",e)}return t},fn.prototype.createVideoClone=function(e){var A=e.ownerDocument.createElement("canvas");A.width=e.offsetWidth,A.height=e.offsetHeight;var t=A.getContext("2d");try{return t&&(t.drawImage(e,0,0,A.width,A.height),this.options.allowTaint||t.getImageData(0,0,A.width,A.height)),A}catch(A){this.context.logger.info("Unable to clone video as it is tainted",e)}A=e.ownerDocument.createElement("canvas");return A.width=e.offsetWidth,A.height=e.offsetHeight,A},fn.prototype.appendChildNode=function(A,e,t){XB(e)&&("SCRIPT"===e.tagName||e.hasAttribute(hn)||"function"==typeof this.options.ignoreElements&&this.options.ignoreElements(e))||this.options.copyStyles&&XB(e)&&SB(e)||A.appendChild(this.cloneNode(e,t))},fn.prototype.cloneChildNodes=function(A,e,t){for(var r,B=this,n=(A.shadowRoot||A).firstChild;n;n=n.nextSibling)XB(n)&&rn(n)&&"function"==typeof n.assignedNodes?(r=n.assignedNodes()).length&&r.forEach(function(A){return B.appendChildNode(e,A,t)}):this.appendChildNode(e,n,t)},fn.prototype.cloneNode=function(A,e){if(PB(A))return document.createTextNode(A.data);if(!A.ownerDocument)return A.cloneNode(!1);var t=A.ownerDocument.defaultView;if(t&&XB(A)&&(JB(A)||YB(A))){var r=this.createElementClone(A);r.style.transitionProperty="none";var B=t.getComputedStyle(A),n=t.getComputedStyle(A,":before"),s=t.getComputedStyle(A,":after");this.referenceElement===A&&JB(r)&&(this.clonedReferenceElement=r),jB(r)&&Mn(r);t=this.counters.parse(new Ur(this.context,B)),n=this.resolvePseudoContent(A,r,n,gn.BEFORE);TB(A)&&(e=!0),MB(A)||this.cloneChildNodes(A,r,e),n&&r.insertBefore(n,r.firstChild);s=this.resolvePseudoContent(A,r,s,gn.AFTER);return s&&r.appendChild(s),this.counters.pop(t),(B&&(this.options.copyStyles||YB(A))&&!An(A)||e)&&Kn(B,r),0===A.scrollTop&&0===A.scrollLeft||this.scrolledElements.push([r,A.scrollLeft,A.scrollTop]),(en(A)||tn(A))&&(en(r)||tn(r))&&(r.value=A.value),r}return A.cloneNode(!1)},fn.prototype.resolvePseudoContent=function(o,A,e,t){var i=this;if(e){var r=e.content,Q=A.ownerDocument;if(Q&&r&&"none"!==r&&"-moz-alt-content"!==r&&"none"!==e.display){this.counters.parse(new Ur(this.context,e));var c=new wr(this.context,e),a=Q.createElement("html2canvaspseudoelement");Kn(e,a),c.content.forEach(function(A){if(0===A.type)a.appendChild(Q.createTextNode(A.value));else if(22===A.type){var e=Q.createElement("img");e.src=A.value,e.style.opacity="1",a.appendChild(e)}else if(18===A.type){var t,r,B,n,s;"attr"===A.name?(e=A.values.filter(_A)).length&&a.appendChild(Q.createTextNode(o.getAttribute(e[0].value)||"")):"counter"===A.name?(B=(r=A.values.filter($A))[0],r=r[1],B&&_A(B)&&(t=i.counters.getCounterValue(B.value),s=r&&_A(r)?pt.parse(i.context,r.value):3,a.appendChild(Q.createTextNode(Fn(t,s,!1))))):"counters"===A.name&&(B=(t=A.values.filter($A))[0],s=t[1],r=t[2],B&&_A(B)&&(B=i.counters.getCounterValues(B.value),n=r&&_A(r)?pt.parse(i.context,r.value):3,s=s&&0===s.type?s.value:"",s=B.map(function(A){return Fn(A,n,!1)}).join(s),a.appendChild(Q.createTextNode(s))))}else if(20===A.type)switch(A.value){case"open-quote":a.appendChild(Q.createTextNode(Xt(c.quotes,i.quoteDepth++,!0)));break;case"close-quote":a.appendChild(Q.createTextNode(Xt(c.quotes,--i.quoteDepth,!1)));break;default:a.appendChild(Q.createTextNode(A.value))}}),a.className=Dn+" "+vn;t=t===gn.BEFORE?" "+Dn:" "+vn;return YB(A)?A.className.baseValue+=t:A.className+=t,a}}},fn.destroy=function(A){return!!A.parentNode&&(A.parentNode.removeChild(A),!0)},fn);function fn(A,e,t){if(this.context=A,this.options=t,this.scrolledElements=[],this.referenceElement=e,this.counters=new Bn,this.quoteDepth=0,!e.ownerDocument)throw new Error("Cloned element does not have an owner document");this.documentElement=this.cloneNode(e.ownerDocument.documentElement,!1)}(he=gn=gn||{})[he.BEFORE=0]="BEFORE",he[he.AFTER=1]="AFTER";function Hn(e){return new Promise(function(A){!e.complete&&e.src?(e.onload=A,e.onerror=A):A()})}var pn=function(A,e){var t=A.createElement("iframe");return t.className="html2canvas-container",t.style.visibility="hidden",t.style.position="fixed",t.style.left="-10000px",t.style.top="0px",t.style.border="0",t.width=e.width.toString(),t.height=e.height.toString(),t.scrolling="no",t.setAttribute(hn,"true"),A.body.appendChild(t),t},En=function(A){return Promise.all([].slice.call(A.images,0).map(Hn))},In=function(B){return new Promise(function(e,A){var t=B.contentWindow;if(!t)return A("No window assigned for iframe");var r=t.document;t.onload=B.onload=function(){t.onload=B.onload=null;var A=setInterval(function(){0"),e},Ln=function(A,e,t){A&&A.defaultView&&(e!==A.defaultView.pageXOffset||t!==A.defaultView.pageYOffset)&&A.defaultView.scrollTo(e,t)},bn=function(A){var e=A[0],t=A[1],A=A[2];e.scrollLeft=t,e.scrollTop=A},Dn="___html2canvas___pseudoelement_before",vn="___html2canvas___pseudoelement_after",xn='{\n content: "" !important;\n display: none !important;\n}',Mn=function(A){Sn(A,"."+Dn+":before"+xn+"\n ."+vn+":after"+xn)},Sn=function(A,e){var t=A.ownerDocument;t&&((t=t.createElement("style")).textContent=e,A.appendChild(t))},Tn=(Gn.getOrigin=function(A){var e=Gn._link;return e?(e.href=A,e.href=e.href,e.protocol+e.hostname+e.port):"about:blank"},Gn.isSameOrigin=function(A){return Gn.getOrigin(A)===Gn._origin},Gn.setContext=function(A){Gn._link=A.document.createElement("a"),Gn._origin=Gn.getOrigin(A.location.href)},Gn._origin="about:blank",Gn);function Gn(){}var On=(Vn.prototype.addImage=function(A){var e=Promise.resolve();return this.has(A)||(Yn(A)||Pn(A))&&(this._cache[A]=this.loadImage(A)).catch(function(){}),e},Vn.prototype.match=function(A){return this._cache[A]},Vn.prototype.loadImage=function(s){return a(this,void 0,void 0,function(){var e,r,t,B,n=this;return H(this,function(A){switch(A.label){case 0:return(e=Tn.isSameOrigin(s),r=!Xn(s)&&!0===this._options.useCORS&&Xr.SUPPORT_CORS_IMAGES&&!e,t=!Xn(s)&&!e&&!Yn(s)&&"string"==typeof this._options.proxy&&Xr.SUPPORT_CORS_XHR&&!r,e||!1!==this._options.allowTaint||Xn(s)||Yn(s)||t||r)?(B=s,t?[4,this.proxy(B)]:[3,2]):[2];case 1:B=A.sent(),A.label=2;case 2:return this.context.logger.debug("Added image "+s.substring(0,256)),[4,new Promise(function(A,e){var t=new Image;t.onload=function(){return A(t)},t.onerror=e,(Jn(B)||r)&&(t.crossOrigin="anonymous"),t.src=B,!0===t.complete&&setTimeout(function(){return A(t)},500),0t.width+C?0:Math.max(0,n-C),Math.max(0,s-l),As.TOP_RIGHT):new Zn(t.left+t.width-C,t.top+l),this.bottomRightPaddingBox=0t.width+F+A?0:n-F+A,s-(l+h),As.TOP_RIGHT):new Zn(t.left+t.width-(C+d),t.top+l+h),this.bottomRightContentBox=0A.element.container.styles.zIndex.order?(s=e,!1):0=A.element.container.styles.zIndex.order?(o=e+1,!1):0, https://github.com/MrRio/jsPDF + * 2015-2021 yWorks GmbH, http://www.yworks.com + * 2015-2021 Lukas Holländer , https://github.com/HackbrettXXX + * 2016-2018 Aras Abbasi + * 2010 Aaron Spike, https://github.com/acspike + * 2012 Willow Systems Corporation, https://github.com/willowsystems + * 2012 Pablo Hess, https://github.com/pablohess + * 2012 Florian Jenett, https://github.com/fjenett + * 2013 Warren Weckesser, https://github.com/warrenweckesser + * 2013 Youssef Beddad, https://github.com/lifof + * 2013 Lee Driscoll, https://github.com/lsdriscoll + * 2013 Stefan Slonevskiy, https://github.com/stefslon + * 2013 Jeremy Morel, https://github.com/jmorel + * 2013 Christoph Hartmann, https://github.com/chris-rock + * 2014 Juan Pablo Gaviria, https://github.com/juanpgaviria + * 2014 James Makes, https://github.com/dollaruw + * 2014 Diego Casorran, https://github.com/diegocr + * 2014 Steven Spungin, https://github.com/Flamenco + * 2014 Kenneth Glassey, https://github.com/Gavvers + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Contributor(s): + * siefkenj, ahwolf, rickygu, Midnith, saintclair, eaparango, + * kim3er, mfo, alnorth, Flamenco + */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).jspdf={})}(this,(function(t){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var r=function(){return"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this}();function n(){r.console&&"function"==typeof r.console.log&&r.console.log.apply(r.console,arguments)}var i={log:n,warn:function(t){r.console&&("function"==typeof r.console.warn?r.console.warn.apply(r.console,arguments):n.call(null,arguments))},error:function(t){r.console&&("function"==typeof r.console.error?r.console.error.apply(r.console,arguments):n(t))}};function a(t,e,r){var n=new XMLHttpRequest;n.open("GET",t),n.responseType="blob",n.onload=function(){l(n.response,e,r)},n.onerror=function(){i.error("could not download file")},n.send()}function o(t){var e=new XMLHttpRequest;e.open("HEAD",t,!1);try{e.send()}catch(t){}return e.status>=200&&e.status<=299}function s(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(r){var e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(e)}}var c,u,l=r.saveAs||("object"!==("undefined"==typeof window?"undefined":e(window))||window!==r?function(){}:"undefined"!=typeof HTMLAnchorElement&&"download"in HTMLAnchorElement.prototype?function(t,e,n){var i=r.URL||r.webkitURL,c=document.createElement("a");e=e||t.name||"download",c.download=e,c.rel="noopener","string"==typeof t?(c.href=t,c.origin!==location.origin?o(c.href)?a(t,e,n):s(c,c.target="_blank"):s(c)):(c.href=i.createObjectURL(t),setTimeout((function(){i.revokeObjectURL(c.href)}),4e4),setTimeout((function(){s(c)}),0))}:"msSaveOrOpenBlob"in navigator?function(t,r,n){if(r=r||t.name||"download","string"==typeof t)if(o(t))a(t,r,n);else{var c=document.createElement("a");c.href=t,c.target="_blank",setTimeout((function(){s(c)}))}else navigator.msSaveOrOpenBlob(function(t,r){return void 0===r?r={autoBom:!1}:"object"!==e(r)&&(i.warn("Deprecated: Expected third argument to be a object"),r={autoBom:!r}),r.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)?new Blob([String.fromCharCode(65279),t],{type:t.type}):t}(t,n),r)}:function(t,n,i,o){if((o=o||open("","_blank"))&&(o.document.title=o.document.body.innerText="downloading..."),"string"==typeof t)return a(t,n,i);var s="application/octet-stream"===t.type,c=/constructor/i.test(r.HTMLElement)||r.safari,u=/CriOS\/[\d]+/.test(navigator.userAgent);if((u||s&&c)&&"object"===("undefined"==typeof FileReader?"undefined":e(FileReader))){var l=new FileReader;l.onloadend=function(){var t=l.result;t=u?t:t.replace(/^data:[^;]*;/,"data:attachment/file;"),o?o.location.href=t:location=t,o=null},l.readAsDataURL(t)}else{var h=r.URL||r.webkitURL,f=h.createObjectURL(t);o?o.location=f:location.href=f,o=null,setTimeout((function(){h.revokeObjectURL(f)}),4e4)}}); +/** + * A class to parse color values + * @author Stoyan Stefanov + * {@link http://www.phpied.com/rgb-color-parser-in-javascript/} + * @license Use it if you like it + */function h(t){var e;t=t||"",this.ok=!1,"#"==t.charAt(0)&&(t=t.substr(1,6));t={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"}[t=(t=t.replace(/ /g,"")).toLowerCase()]||t;for(var r=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}}],n=0;n255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"},this.toHex=function(){var t=this.r.toString(16),e=this.g.toString(16),r=this.b.toString(16);return 1==t.length&&(t="0"+t),1==e.length&&(e="0"+e),1==r.length&&(r="0"+r),"#"+t+e+r}} +/** + * @license + * Joseph Myers does not specify a particular license for his work. + * + * Author: Joseph Myers + * Accessed from: http://www.myersdaily.org/joseph/javascript/md5.js + * + * Modified by: Owen Leong + */ +function f(t,e){var r=t[0],n=t[1],i=t[2],a=t[3];r=p(r,n,i,a,e[0],7,-680876936),a=p(a,r,n,i,e[1],12,-389564586),i=p(i,a,r,n,e[2],17,606105819),n=p(n,i,a,r,e[3],22,-1044525330),r=p(r,n,i,a,e[4],7,-176418897),a=p(a,r,n,i,e[5],12,1200080426),i=p(i,a,r,n,e[6],17,-1473231341),n=p(n,i,a,r,e[7],22,-45705983),r=p(r,n,i,a,e[8],7,1770035416),a=p(a,r,n,i,e[9],12,-1958414417),i=p(i,a,r,n,e[10],17,-42063),n=p(n,i,a,r,e[11],22,-1990404162),r=p(r,n,i,a,e[12],7,1804603682),a=p(a,r,n,i,e[13],12,-40341101),i=p(i,a,r,n,e[14],17,-1502002290),r=g(r,n=p(n,i,a,r,e[15],22,1236535329),i,a,e[1],5,-165796510),a=g(a,r,n,i,e[6],9,-1069501632),i=g(i,a,r,n,e[11],14,643717713),n=g(n,i,a,r,e[0],20,-373897302),r=g(r,n,i,a,e[5],5,-701558691),a=g(a,r,n,i,e[10],9,38016083),i=g(i,a,r,n,e[15],14,-660478335),n=g(n,i,a,r,e[4],20,-405537848),r=g(r,n,i,a,e[9],5,568446438),a=g(a,r,n,i,e[14],9,-1019803690),i=g(i,a,r,n,e[3],14,-187363961),n=g(n,i,a,r,e[8],20,1163531501),r=g(r,n,i,a,e[13],5,-1444681467),a=g(a,r,n,i,e[2],9,-51403784),i=g(i,a,r,n,e[7],14,1735328473),r=m(r,n=g(n,i,a,r,e[12],20,-1926607734),i,a,e[5],4,-378558),a=m(a,r,n,i,e[8],11,-2022574463),i=m(i,a,r,n,e[11],16,1839030562),n=m(n,i,a,r,e[14],23,-35309556),r=m(r,n,i,a,e[1],4,-1530992060),a=m(a,r,n,i,e[4],11,1272893353),i=m(i,a,r,n,e[7],16,-155497632),n=m(n,i,a,r,e[10],23,-1094730640),r=m(r,n,i,a,e[13],4,681279174),a=m(a,r,n,i,e[0],11,-358537222),i=m(i,a,r,n,e[3],16,-722521979),n=m(n,i,a,r,e[6],23,76029189),r=m(r,n,i,a,e[9],4,-640364487),a=m(a,r,n,i,e[12],11,-421815835),i=m(i,a,r,n,e[15],16,530742520),r=v(r,n=m(n,i,a,r,e[2],23,-995338651),i,a,e[0],6,-198630844),a=v(a,r,n,i,e[7],10,1126891415),i=v(i,a,r,n,e[14],15,-1416354905),n=v(n,i,a,r,e[5],21,-57434055),r=v(r,n,i,a,e[12],6,1700485571),a=v(a,r,n,i,e[3],10,-1894986606),i=v(i,a,r,n,e[10],15,-1051523),n=v(n,i,a,r,e[1],21,-2054922799),r=v(r,n,i,a,e[8],6,1873313359),a=v(a,r,n,i,e[15],10,-30611744),i=v(i,a,r,n,e[6],15,-1560198380),n=v(n,i,a,r,e[13],21,1309151649),r=v(r,n,i,a,e[4],6,-145523070),a=v(a,r,n,i,e[11],10,-1120210379),i=v(i,a,r,n,e[2],15,718787259),n=v(n,i,a,r,e[9],21,-343485551),t[0]=S(r,t[0]),t[1]=S(n,t[1]),t[2]=S(i,t[2]),t[3]=S(a,t[3])}function d(t,e,r,n,i,a){return e=S(S(e,t),S(n,a)),S(e<>>32-i,r)}function p(t,e,r,n,i,a,o){return d(e&r|~e&n,t,e,i,a,o)}function g(t,e,r,n,i,a,o){return d(e&n|r&~n,t,e,i,a,o)}function m(t,e,r,n,i,a,o){return d(e^r^n,t,e,i,a,o)}function v(t,e,r,n,i,a,o){return d(r^(e|~n),t,e,i,a,o)}function b(t){var e,r=t.length,n=[1732584193,-271733879,-1732584194,271733878];for(e=64;e<=t.length;e+=64)f(n,y(t.substring(e-64,e)));t=t.substring(e-64);var i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(e=0;e>2]|=t.charCodeAt(e)<<(e%4<<3);if(i[e>>2]|=128<<(e%4<<3),e>55)for(f(n,i),e=0;e<16;e++)i[e]=0;return i[14]=8*r,f(n,i),n}function y(t){var e,r=[];for(e=0;e<64;e+=4)r[e>>2]=t.charCodeAt(e)+(t.charCodeAt(e+1)<<8)+(t.charCodeAt(e+2)<<16)+(t.charCodeAt(e+3)<<24);return r}c=r.atob.bind(r),u=r.btoa.bind(r);var w="0123456789abcdef".split("");function N(t){for(var e="",r=0;r<4;r++)e+=w[t>>8*r+4&15]+w[t>>8*r&15];return e}function L(t){return String.fromCharCode((255&t)>>0,(65280&t)>>8,(16711680&t)>>16,(4278190080&t)>>24)}function A(t){return function(t){return t.map(L).join("")}(b(t))}var x="5d41402abc4b2a76b9719d911017c592"!=function(t){for(var e=0;e>16)+(e>>16)+(r>>16)<<16|65535&r}return t+e&4294967295} +/** + * @license + * FPDF is released under a permissive license: there is no usage restriction. + * You may embed it freely in your application (commercial or not), with or + * without modifications. + * + * Reference: http://www.fpdf.org/en/script/script37.php + */function _(t,e){var r,n,i,a;if(t!==r){for(var o=(i=t,a=1+(256/t.length>>0),new Array(a+1).join(i)),s=[],c=0;c<256;c++)s[c]=c;var u=0;for(c=0;c<256;c++){var l=s[c];u=(u+l+o.charCodeAt(c))%256,s[c]=s[u],s[u]=l}r=t,n=s}else s=n;var h=e.length,f=0,d=0,p="";for(c=0;c€/\f©þdSiz";var a=(e+this.padding).substr(0,32),o=(r+this.padding).substr(0,32);this.O=this.processOwnerPassword(a,o),this.P=-(1+(255^i)),this.encryptionKey=A(a+this.O+this.lsbFirstWord(this.P)+this.hexToBytes(n)).substr(0,5),this.U=_(this.encryptionKey,this.padding)}function F(t){if(/[^\u0000-\u00ff]/.test(t))throw new Error("Invalid PDF Name Object: "+t+", Only accept ASCII characters.");for(var e="",r=t.length,n=0;n126)e+="#"+("0"+i.toString(16)).slice(-2);else e+=t[n]}return e}function I(t){if("object"!==e(t))throw new Error("Invalid Context passed to initialize PubSub (jsPDF-module)");var n={};this.subscribe=function(t,e,r){if(r=r||!1,"string"!=typeof t||"function"!=typeof e||"boolean"!=typeof r)throw new Error("Invalid arguments passed to PubSub.subscribe (jsPDF-module)");n.hasOwnProperty(t)||(n[t]={});var i=Math.random().toString(35);return n[t][i]=[e,!!r],i},this.unsubscribe=function(t){for(var e in n)if(n[e][t])return delete n[e][t],0===Object.keys(n[e]).length&&delete n[e],!0;return!1},this.publish=function(e){if(n.hasOwnProperty(e)){var a=Array.prototype.slice.call(arguments,1),o=[];for(var s in n[e]){var c=n[e][s];try{c[0].apply(t,a)}catch(t){r.console&&i.error("jsPDF PubSub Error",t.message,t)}c[1]&&o.push(s)}o.length&&o.forEach(this.unsubscribe)}},this.getTopics=function(){return n}}function C(t){if(!(this instanceof C))return new C(t);var e="opacity,stroke-opacity".split(",");for(var r in t)t.hasOwnProperty(r)&&e.indexOf(r)>=0&&(this[r]=t[r]);this.id="",this.objectNumber=-1}function j(t,e){this.gState=t,this.matrix=e,this.id="",this.objectNumber=-1}function O(t,e,r,n,i){if(!(this instanceof O))return new O(t,e,r,n,i);this.type="axial"===t?2:3,this.coords=e,this.colors=r,j.call(this,n,i)}function B(t,e,r,n,i){if(!(this instanceof B))return new B(t,e,r,n,i);this.boundingBox=t,this.xStep=e,this.yStep=r,this.stream="",this.cloneIndex=0,j.call(this,n,i)}function M(t){var n,a="string"==typeof arguments[0]?arguments[0]:"p",o=arguments[1],s=arguments[2],c=arguments[3],f=[],d=1,p=16,g="S",m=null;"object"===e(t=t||{})&&(a=t.orientation,o=t.unit||o,s=t.format||s,c=t.compress||t.compressPdf||c,null!==(m=t.encryption||null)&&(m.userPassword=m.userPassword||"",m.ownerPassword=m.ownerPassword||"",m.userPermissions=m.userPermissions||[]),d="number"==typeof t.userUnit?Math.abs(t.userUnit):1,void 0!==t.precision&&(n=t.precision),void 0!==t.floatPrecision&&(p=t.floatPrecision),g=t.defaultPathOperation||"S"),f=t.filters||(!0===c?["FlateEncode"]:f),o=o||"mm",a=(""+(a||"P")).toLowerCase();var v=t.putOnlyUsedFonts||!1,b={},y={internal:{},__private__:{}};y.__private__.PubSub=I;var w="1.3",N=y.__private__.getPdfVersion=function(){return w};y.__private__.setPdfVersion=function(t){w=t};var L={a0:[2383.94,3370.39],a1:[1683.78,2383.94],a2:[1190.55,1683.78],a3:[841.89,1190.55],a4:[595.28,841.89],a5:[419.53,595.28],a6:[297.64,419.53],a7:[209.76,297.64],a8:[147.4,209.76],a9:[104.88,147.4],a10:[73.7,104.88],b0:[2834.65,4008.19],b1:[2004.09,2834.65],b2:[1417.32,2004.09],b3:[1000.63,1417.32],b4:[708.66,1000.63],b5:[498.9,708.66],b6:[354.33,498.9],b7:[249.45,354.33],b8:[175.75,249.45],b9:[124.72,175.75],b10:[87.87,124.72],c0:[2599.37,3676.54],c1:[1836.85,2599.37],c2:[1298.27,1836.85],c3:[918.43,1298.27],c4:[649.13,918.43],c5:[459.21,649.13],c6:[323.15,459.21],c7:[229.61,323.15],c8:[161.57,229.61],c9:[113.39,161.57],c10:[79.37,113.39],dl:[311.81,623.62],letter:[612,792],"government-letter":[576,756],legal:[612,1008],"junior-legal":[576,360],ledger:[1224,792],tabloid:[792,1224],"credit-card":[153,243]};y.__private__.getPageFormats=function(){return L};var A=y.__private__.getPageFormat=function(t){return L[t]};s=s||"a4";var x={COMPAT:"compat",ADVANCED:"advanced"},S=x.COMPAT;function _(){this.saveGraphicsState(),ht(new Vt(_t,0,0,-_t,0,Rr()*_t).toString()+" cm"),this.setFontSize(this.getFontSize()/_t),g="n",S=x.ADVANCED}function P(){this.restoreGraphicsState(),g="S",S=x.COMPAT}var j=y.__private__.combineFontStyleAndFontWeight=function(t,e){if("bold"==t&&"normal"==e||"bold"==t&&400==e||"normal"==t&&"italic"==e||"bold"==t&&"italic"==e)throw new Error("Invalid Combination of fontweight and fontstyle");return e&&(t=400==e||"normal"===e?"italic"===t?"italic":"normal":700!=e&&"bold"!==e||"normal"!==t?(700==e?"bold":e)+""+t:"bold"),t};y.advancedAPI=function(t){var e=S===x.COMPAT;return e&&_.call(this),"function"!=typeof t||(t(this),e&&P.call(this)),this},y.compatAPI=function(t){var e=S===x.ADVANCED;return e&&P.call(this),"function"!=typeof t||(t(this),e&&_.call(this)),this},y.isAdvancedAPI=function(){return S===x.ADVANCED};var E,q=function(t){if(S!==x.ADVANCED)throw new Error(t+" is only available in 'advanced' API mode. You need to call advancedAPI() first.")},D=y.roundToPrecision=y.__private__.roundToPrecision=function(t,e){var r=n||e;if(isNaN(t)||isNaN(r))throw new Error("Invalid argument passed to jsPDF.roundToPrecision");return t.toFixed(r).replace(/0+$/,"")};E=y.hpf=y.__private__.hpf="number"==typeof p?function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.hpf");return D(t,p)}:"smart"===p?function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.hpf");return D(t,t>-1&&t<1?16:5)}:function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.hpf");return D(t,16)};var R=y.f2=y.__private__.f2=function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.f2");return D(t,2)},T=y.__private__.f3=function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.f3");return D(t,3)},U=y.scale=y.__private__.scale=function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.scale");return S===x.COMPAT?t*_t:S===x.ADVANCED?t:void 0},z=function(t){return S===x.COMPAT?Rr()-t:S===x.ADVANCED?t:void 0},H=function(t){return U(z(t))};y.__private__.setPrecision=y.setPrecision=function(t){"number"==typeof parseInt(t,10)&&(n=parseInt(t,10))};var W,V="00000000000000000000000000000000",G=y.__private__.getFileId=function(){return V},Y=y.__private__.setFileId=function(t){return V=void 0!==t&&/^[a-fA-F0-9]{32}$/.test(t)?t.toUpperCase():V.split("").map((function(){return"ABCDEF0123456789".charAt(Math.floor(16*Math.random()))})).join(""),null!==m&&(Ye=new k(m.userPermissions,m.userPassword,m.ownerPassword,V)),V};y.setFileId=function(t){return Y(t),this},y.getFileId=function(){return G()};var J=y.__private__.convertDateToPDFDate=function(t){var e=t.getTimezoneOffset(),r=e<0?"+":"-",n=Math.floor(Math.abs(e/60)),i=Math.abs(e%60),a=[r,Q(n),"'",Q(i),"'"].join("");return["D:",t.getFullYear(),Q(t.getMonth()+1),Q(t.getDate()),Q(t.getHours()),Q(t.getMinutes()),Q(t.getSeconds()),a].join("")},X=y.__private__.convertPDFDateToDate=function(t){var e=parseInt(t.substr(2,4),10),r=parseInt(t.substr(6,2),10)-1,n=parseInt(t.substr(8,2),10),i=parseInt(t.substr(10,2),10),a=parseInt(t.substr(12,2),10),o=parseInt(t.substr(14,2),10);return new Date(e,r,n,i,a,o,0)},K=y.__private__.setCreationDate=function(t){var e;if(void 0===t&&(t=new Date),t instanceof Date)e=J(t);else{if(!/^D:(20[0-2][0-9]|203[0-7]|19[7-9][0-9])(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])(0[0-9]|1[0-9]|2[0-3])(0[0-9]|[1-5][0-9])(0[0-9]|[1-5][0-9])(\+0[0-9]|\+1[0-4]|-0[0-9]|-1[0-1])'(0[0-9]|[1-5][0-9])'?$/.test(t))throw new Error("Invalid argument passed to jsPDF.setCreationDate");e=t}return W=e},Z=y.__private__.getCreationDate=function(t){var e=W;return"jsDate"===t&&(e=X(W)),e};y.setCreationDate=function(t){return K(t),this},y.getCreationDate=function(t){return Z(t)};var $,Q=y.__private__.padd2=function(t){return("0"+parseInt(t)).slice(-2)},tt=y.__private__.padd2Hex=function(t){return("00"+(t=t.toString())).substr(t.length)},et=0,rt=[],nt=[],it=0,at=[],ot=[],st=!1,ct=nt,ut=function(){et=0,it=0,nt=[],rt=[],at=[],Qt=Kt(),te=Kt()};y.__private__.setCustomOutputDestination=function(t){st=!0,ct=t};var lt=function(t){st||(ct=t)};y.__private__.resetCustomOutputDestination=function(){st=!1,ct=nt};var ht=y.__private__.out=function(t){return t=t.toString(),it+=t.length+1,ct.push(t),ct},ft=y.__private__.write=function(t){return ht(1===arguments.length?t.toString():Array.prototype.join.call(arguments," "))},dt=y.__private__.getArrayBuffer=function(t){for(var e=t.length,r=new ArrayBuffer(e),n=new Uint8Array(r);e--;)n[e]=t.charCodeAt(e);return r},pt=[["Helvetica","helvetica","normal","WinAnsiEncoding"],["Helvetica-Bold","helvetica","bold","WinAnsiEncoding"],["Helvetica-Oblique","helvetica","italic","WinAnsiEncoding"],["Helvetica-BoldOblique","helvetica","bolditalic","WinAnsiEncoding"],["Courier","courier","normal","WinAnsiEncoding"],["Courier-Bold","courier","bold","WinAnsiEncoding"],["Courier-Oblique","courier","italic","WinAnsiEncoding"],["Courier-BoldOblique","courier","bolditalic","WinAnsiEncoding"],["Times-Roman","times","normal","WinAnsiEncoding"],["Times-Bold","times","bold","WinAnsiEncoding"],["Times-Italic","times","italic","WinAnsiEncoding"],["Times-BoldItalic","times","bolditalic","WinAnsiEncoding"],["ZapfDingbats","zapfdingbats","normal",null],["Symbol","symbol","normal",null]];y.__private__.getStandardFonts=function(){return pt};var gt=t.fontSize||16;y.__private__.setFontSize=y.setFontSize=function(t){return gt=S===x.ADVANCED?t/_t:t,this};var mt,vt=y.__private__.getFontSize=y.getFontSize=function(){return S===x.COMPAT?gt:gt*_t},bt=t.R2L||!1;y.__private__.setR2L=y.setR2L=function(t){return bt=t,this},y.__private__.getR2L=y.getR2L=function(){return bt};var yt,wt=y.__private__.setZoomMode=function(t){var e=[void 0,null,"fullwidth","fullheight","fullpage","original"];if(/^(?:\d+\.\d*|\d*\.\d+|\d+)%$/.test(t))mt=t;else if(isNaN(t)){if(-1===e.indexOf(t))throw new Error('zoom must be Integer (e.g. 2), a percentage Value (e.g. 300%) or fullwidth, fullheight, fullpage, original. "'+t+'" is not recognized.');mt=t}else mt=parseInt(t,10)};y.__private__.getZoomMode=function(){return mt};var Nt,Lt=y.__private__.setPageMode=function(t){if(-1==[void 0,null,"UseNone","UseOutlines","UseThumbs","FullScreen"].indexOf(t))throw new Error('Page mode must be one of UseNone, UseOutlines, UseThumbs, or FullScreen. "'+t+'" is not recognized.');yt=t};y.__private__.getPageMode=function(){return yt};var At=y.__private__.setLayoutMode=function(t){if(-1==[void 0,null,"continuous","single","twoleft","tworight","two"].indexOf(t))throw new Error('Layout mode must be one of continuous, single, twoleft, tworight. "'+t+'" is not recognized.');Nt=t};y.__private__.getLayoutMode=function(){return Nt},y.__private__.setDisplayMode=y.setDisplayMode=function(t,e,r){return wt(t),At(e),Lt(r),this};var xt={title:"",subject:"",author:"",keywords:"",creator:""};y.__private__.getDocumentProperty=function(t){if(-1===Object.keys(xt).indexOf(t))throw new Error("Invalid argument passed to jsPDF.getDocumentProperty");return xt[t]},y.__private__.getDocumentProperties=function(){return xt},y.__private__.setDocumentProperties=y.setProperties=y.setDocumentProperties=function(t){for(var e in xt)xt.hasOwnProperty(e)&&t[e]&&(xt[e]=t[e]);return this},y.__private__.setDocumentProperty=function(t,e){if(-1===Object.keys(xt).indexOf(t))throw new Error("Invalid arguments passed to jsPDF.setDocumentProperty");return xt[t]=e};var St,_t,Pt,kt,Ft,It={},Ct={},jt=[],Ot={},Bt={},Mt={},Et={},qt=null,Dt=0,Rt=[],Tt=new I(y),Ut=t.hotfixes||[],zt={},Ht={},Wt=[],Vt=function t(e,r,n,i,a,o){if(!(this instanceof t))return new t(e,r,n,i,a,o);isNaN(e)&&(e=1),isNaN(r)&&(r=0),isNaN(n)&&(n=0),isNaN(i)&&(i=1),isNaN(a)&&(a=0),isNaN(o)&&(o=0),this._matrix=[e,r,n,i,a,o]};Object.defineProperty(Vt.prototype,"sx",{get:function(){return this._matrix[0]},set:function(t){this._matrix[0]=t}}),Object.defineProperty(Vt.prototype,"shy",{get:function(){return this._matrix[1]},set:function(t){this._matrix[1]=t}}),Object.defineProperty(Vt.prototype,"shx",{get:function(){return this._matrix[2]},set:function(t){this._matrix[2]=t}}),Object.defineProperty(Vt.prototype,"sy",{get:function(){return this._matrix[3]},set:function(t){this._matrix[3]=t}}),Object.defineProperty(Vt.prototype,"tx",{get:function(){return this._matrix[4]},set:function(t){this._matrix[4]=t}}),Object.defineProperty(Vt.prototype,"ty",{get:function(){return this._matrix[5]},set:function(t){this._matrix[5]=t}}),Object.defineProperty(Vt.prototype,"a",{get:function(){return this._matrix[0]},set:function(t){this._matrix[0]=t}}),Object.defineProperty(Vt.prototype,"b",{get:function(){return this._matrix[1]},set:function(t){this._matrix[1]=t}}),Object.defineProperty(Vt.prototype,"c",{get:function(){return this._matrix[2]},set:function(t){this._matrix[2]=t}}),Object.defineProperty(Vt.prototype,"d",{get:function(){return this._matrix[3]},set:function(t){this._matrix[3]=t}}),Object.defineProperty(Vt.prototype,"e",{get:function(){return this._matrix[4]},set:function(t){this._matrix[4]=t}}),Object.defineProperty(Vt.prototype,"f",{get:function(){return this._matrix[5]},set:function(t){this._matrix[5]=t}}),Object.defineProperty(Vt.prototype,"rotation",{get:function(){return Math.atan2(this.shx,this.sx)}}),Object.defineProperty(Vt.prototype,"scaleX",{get:function(){return this.decompose().scale.sx}}),Object.defineProperty(Vt.prototype,"scaleY",{get:function(){return this.decompose().scale.sy}}),Object.defineProperty(Vt.prototype,"isIdentity",{get:function(){return 1===this.sx&&(0===this.shy&&(0===this.shx&&(1===this.sy&&(0===this.tx&&0===this.ty))))}}),Vt.prototype.join=function(t){return[this.sx,this.shy,this.shx,this.sy,this.tx,this.ty].map(E).join(t)},Vt.prototype.multiply=function(t){var e=t.sx*this.sx+t.shy*this.shx,r=t.sx*this.shy+t.shy*this.sy,n=t.shx*this.sx+t.sy*this.shx,i=t.shx*this.shy+t.sy*this.sy,a=t.tx*this.sx+t.ty*this.shx+this.tx,o=t.tx*this.shy+t.ty*this.sy+this.ty;return new Vt(e,r,n,i,a,o)},Vt.prototype.decompose=function(){var t=this.sx,e=this.shy,r=this.shx,n=this.sy,i=this.tx,a=this.ty,o=Math.sqrt(t*t+e*e),s=(t/=o)*r+(e/=o)*n;r-=t*s,n-=e*s;var c=Math.sqrt(r*r+n*n);return s/=c,t*(n/=c)>16&255,i=u>>8&255,a=255&u}if(void 0===i||void 0===o&&n===i&&i===a)if("string"==typeof n)r=n+" "+s[0];else switch(t.precision){case 2:r=R(n/255)+" "+s[0];break;case 3:default:r=T(n/255)+" "+s[0]}else if(void 0===o||"object"===e(o)){if(o&&!isNaN(o.a)&&0===o.a)return r=["1.","1.","1.",s[1]].join(" ");if("string"==typeof n)r=[n,i,a,s[1]].join(" ");else switch(t.precision){case 2:r=[R(n/255),R(i/255),R(a/255),s[1]].join(" ");break;default:case 3:r=[T(n/255),T(i/255),T(a/255),s[1]].join(" ")}}else if("string"==typeof n)r=[n,i,a,o,s[2]].join(" ");else switch(t.precision){case 2:r=[R(n),R(i),R(a),R(o),s[2]].join(" ");break;case 3:default:r=[T(n),T(i),T(a),T(o),s[2]].join(" ")}return r},ne=y.__private__.getFilters=function(){return f},ie=y.__private__.putStream=function(t){var e=(t=t||{}).data||"",r=t.filters||ne(),n=t.alreadyAppliedFilters||[],i=t.addLength1||!1,a=e.length,o=t.objectId,s=function(t){return t};if(null!==m&&void 0===o)throw new Error("ObjectId must be passed to putStream for file encryption");null!==m&&(s=Ye.encryptor(o,0));var c={};!0===r&&(r=["FlateEncode"]);var u=t.additionalKeyValues||[],l=(c=void 0!==M.API.processDataByFilters?M.API.processDataByFilters(e,r):{data:e,reverseChain:[]}).reverseChain+(Array.isArray(n)?n.join(" "):n.toString());if(0!==c.data.length&&(u.push({key:"Length",value:c.data.length}),!0===i&&u.push({key:"Length1",value:a})),0!=l.length)if(l.split("/").length-1==1)u.push({key:"Filter",value:l});else{u.push({key:"Filter",value:"["+l+"]"});for(var h=0;h>"),0!==c.data.length&&(ht("stream"),ht(s(c.data)),ht("endstream"))},ae=y.__private__.putPage=function(t){var e=t.number,r=t.data,n=t.objId,i=t.contentsObjId;Zt(n,!0),ht("<>"),ht("endobj");var a=r.join("\n");return S===x.ADVANCED&&(a+="\nQ"),Zt(i,!0),ie({data:a,filters:ne(),objectId:i}),ht("endobj"),n},oe=y.__private__.putPages=function(){var t,e,r=[];for(t=1;t<=Dt;t++)Rt[t].objId=Kt(),Rt[t].contentsObjId=Kt();for(t=1;t<=Dt;t++)r.push(ae({number:t,data:ot[t],objId:Rt[t].objId,contentsObjId:Rt[t].contentsObjId,mediaBox:Rt[t].mediaBox,cropBox:Rt[t].cropBox,bleedBox:Rt[t].bleedBox,trimBox:Rt[t].trimBox,artBox:Rt[t].artBox,userUnit:Rt[t].userUnit,rootDictionaryObjId:Qt,resourceDictionaryObjId:te}));Zt(Qt,!0),ht("<>"),ht("endobj"),Tt.publish("postPutPages")},se=function(t){Tt.publish("putFont",{font:t,out:ht,newObject:Xt,putStream:ie}),!0!==t.isAlreadyPutted&&(t.objectNumber=Xt(),ht("<<"),ht("/Type /Font"),ht("/BaseFont /"+F(t.postScriptName)),ht("/Subtype /Type1"),"string"==typeof t.encoding&&ht("/Encoding /"+t.encoding),ht("/FirstChar 32"),ht("/LastChar 255"),ht(">>"),ht("endobj"))},ce=function(){for(var t in It)It.hasOwnProperty(t)&&(!1===v||!0===v&&b.hasOwnProperty(t))&&se(It[t])},ue=function(t){t.objectNumber=Xt();var e=[];e.push({key:"Type",value:"/XObject"}),e.push({key:"Subtype",value:"/Form"}),e.push({key:"BBox",value:"["+[E(t.x),E(t.y),E(t.x+t.width),E(t.y+t.height)].join(" ")+"]"}),e.push({key:"Matrix",value:"["+t.matrix.toString()+"]"});var r=t.pages[1].join("\n");ie({data:r,additionalKeyValues:e,objectId:t.objectNumber}),ht("endobj")},le=function(){for(var t in zt)zt.hasOwnProperty(t)&&ue(zt[t])},he=function(t,e){var r,n=[],i=1/(e-1);for(r=0;r<1;r+=i)n.push(r);if(n.push(1),0!=t[0].offset){var a={offset:0,color:t[0].color};t.unshift(a)}if(1!=t[t.length-1].offset){var o={offset:1,color:t[t.length-1].color};t.push(o)}for(var s="",c=0,u=0;ut[c+1].offset;)c++;var l=t[c].offset,h=(r-l)/(t[c+1].offset-l),f=t[c].color,d=t[c+1].color;s+=tt(Math.round((1-h)*f[0]+h*d[0]).toString(16))+tt(Math.round((1-h)*f[1]+h*d[1]).toString(16))+tt(Math.round((1-h)*f[2]+h*d[2]).toString(16))}return s.trim()},fe=function(t,e){e||(e=21);var r=Xt(),n=he(t.colors,e),i=[];i.push({key:"FunctionType",value:"0"}),i.push({key:"Domain",value:"[0.0 1.0]"}),i.push({key:"Size",value:"["+e+"]"}),i.push({key:"BitsPerSample",value:"8"}),i.push({key:"Range",value:"[0.0 1.0 0.0 1.0 0.0 1.0]"}),i.push({key:"Decode",value:"[0.0 1.0 0.0 1.0 0.0 1.0]"}),ie({data:n,additionalKeyValues:i,alreadyAppliedFilters:["/ASCIIHexDecode"],objectId:r}),ht("endobj"),t.objectNumber=Xt(),ht("<< /ShadingType "+t.type),ht("/ColorSpace /DeviceRGB");var a="/Coords ["+E(parseFloat(t.coords[0]))+" "+E(parseFloat(t.coords[1]))+" ";2===t.type?a+=E(parseFloat(t.coords[2]))+" "+E(parseFloat(t.coords[3])):a+=E(parseFloat(t.coords[2]))+" "+E(parseFloat(t.coords[3]))+" "+E(parseFloat(t.coords[4]))+" "+E(parseFloat(t.coords[5])),ht(a+="]"),t.matrix&&ht("/Matrix ["+t.matrix.toString()+"]"),ht("/Function "+r+" 0 R"),ht("/Extend [true true]"),ht(">>"),ht("endobj")},de=function(t,e){var r=Kt(),n=Xt();e.push({resourcesOid:r,objectOid:n}),t.objectNumber=n;var i=[];i.push({key:"Type",value:"/Pattern"}),i.push({key:"PatternType",value:"1"}),i.push({key:"PaintType",value:"1"}),i.push({key:"TilingType",value:"1"}),i.push({key:"BBox",value:"["+t.boundingBox.map(E).join(" ")+"]"}),i.push({key:"XStep",value:E(t.xStep)}),i.push({key:"YStep",value:E(t.yStep)}),i.push({key:"Resources",value:r+" 0 R"}),t.matrix&&i.push({key:"Matrix",value:"["+t.matrix.toString()+"]"}),ie({data:t.stream,additionalKeyValues:i,objectId:t.objectNumber}),ht("endobj")},pe=function(t){var e;for(e in Ot)Ot.hasOwnProperty(e)&&(Ot[e]instanceof O?fe(Ot[e]):Ot[e]instanceof B&&de(Ot[e],t))},ge=function(t){for(var e in t.objectNumber=Xt(),ht("<<"),t)switch(e){case"opacity":ht("/ca "+R(t[e]));break;case"stroke-opacity":ht("/CA "+R(t[e]))}ht(">>"),ht("endobj")},me=function(){var t;for(t in Mt)Mt.hasOwnProperty(t)&&ge(Mt[t])},ve=function(){for(var t in ht("/XObject <<"),zt)zt.hasOwnProperty(t)&&zt[t].objectNumber>=0&&ht("/"+t+" "+zt[t].objectNumber+" 0 R");Tt.publish("putXobjectDict"),ht(">>")},be=function(){Ye.oid=Xt(),ht("<<"),ht("/Filter /Standard"),ht("/V "+Ye.v),ht("/R "+Ye.r),ht("/U <"+Ye.toHexString(Ye.U)+">"),ht("/O <"+Ye.toHexString(Ye.O)+">"),ht("/P "+Ye.P),ht(">>"),ht("endobj")},ye=function(){for(var t in ht("/Font <<"),It)It.hasOwnProperty(t)&&(!1===v||!0===v&&b.hasOwnProperty(t))&&ht("/"+t+" "+It[t].objectNumber+" 0 R");ht(">>")},we=function(){if(Object.keys(Ot).length>0){for(var t in ht("/Shading <<"),Ot)Ot.hasOwnProperty(t)&&Ot[t]instanceof O&&Ot[t].objectNumber>=0&&ht("/"+t+" "+Ot[t].objectNumber+" 0 R");Tt.publish("putShadingPatternDict"),ht(">>")}},Ne=function(t){if(Object.keys(Ot).length>0){for(var e in ht("/Pattern <<"),Ot)Ot.hasOwnProperty(e)&&Ot[e]instanceof y.TilingPattern&&Ot[e].objectNumber>=0&&Ot[e].objectNumber>")}},Le=function(){if(Object.keys(Mt).length>0){var t;for(t in ht("/ExtGState <<"),Mt)Mt.hasOwnProperty(t)&&Mt[t].objectNumber>=0&&ht("/"+t+" "+Mt[t].objectNumber+" 0 R");Tt.publish("putGStateDict"),ht(">>")}},Ae=function(t){Zt(t.resourcesOid,!0),ht("<<"),ht("/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]"),ye(),we(),Ne(t.objectOid),Le(),ve(),ht(">>"),ht("endobj")},xe=function(){var t=[];ce(),me(),le(),pe(t),Tt.publish("putResources"),t.forEach(Ae),Ae({resourcesOid:te,objectOid:Number.MAX_SAFE_INTEGER}),Tt.publish("postPutResources")},Se=function(){Tt.publish("putAdditionalObjects");for(var t=0;t>8&&(c=!0);t=s.join("")}for(r=t.length;void 0===c&&0!==r;)t.charCodeAt(r-1)>>8&&(c=!0),r--;if(!c)return t;for(s=e.noBOM?[]:[254,255],r=0,n=t.length;r>8)>>8)throw new Error("Character at position "+r+" of string '"+t+"' exceeds 16bits. Cannot be encoded into UCS-2 BE");s.push(l),s.push(u-(l<<8))}return String.fromCharCode.apply(void 0,s)},Ce=y.__private__.pdfEscape=y.pdfEscape=function(t,e){return Ie(t,e).replace(/\\/g,"\\\\").replace(/\(/g,"\\(").replace(/\)/g,"\\)")},je=y.__private__.beginPage=function(t){ot[++Dt]=[],Rt[Dt]={objId:0,contentsObjId:0,userUnit:Number(d),artBox:null,bleedBox:null,cropBox:null,trimBox:null,mediaBox:{bottomLeftX:0,bottomLeftY:0,topRightX:Number(t[0]),topRightY:Number(t[1])}},Me(Dt),lt(ot[$])},Oe=function(t,e){var r,n,o;switch(a=e||a,"string"==typeof t&&(r=A(t.toLowerCase()),Array.isArray(r)&&(n=r[0],o=r[1])),Array.isArray(t)&&(n=t[0]*_t,o=t[1]*_t),isNaN(n)&&(n=s[0],o=s[1]),(n>14400||o>14400)&&(i.warn("A page in a PDF can not be wider or taller than 14400 userUnit. jsPDF limits the width/height to 14400"),n=Math.min(14400,n),o=Math.min(14400,o)),s=[n,o],a.substr(0,1)){case"l":o>n&&(s=[o,n]);break;case"p":n>o&&(s=[o,n])}je(s),pr(fr),ht(Lr),0!==kr&&ht(kr+" J"),0!==Fr&&ht(Fr+" j"),Tt.publish("addPage",{pageNumber:Dt})},Be=function(t){t>0&&t<=Dt&&(ot.splice(t,1),Rt.splice(t,1),Dt--,$>Dt&&($=Dt),this.setPage($))},Me=function(t){t>0&&t<=Dt&&($=t)},Ee=y.__private__.getNumberOfPages=y.getNumberOfPages=function(){return ot.length-1},qe=function(t,e,r){var n,a=void 0;return r=r||{},t=void 0!==t?t:It[St].fontName,e=void 0!==e?e:It[St].fontStyle,n=t.toLowerCase(),void 0!==Ct[n]&&void 0!==Ct[n][e]?a=Ct[n][e]:void 0!==Ct[t]&&void 0!==Ct[t][e]?a=Ct[t][e]:!1===r.disableWarning&&i.warn("Unable to look up font label for font '"+t+"', '"+e+"'. Refer to getFontList() for available fonts."),a||r.noFallback||null==(a=Ct.times[e])&&(a=Ct.times.normal),a},De=y.__private__.putInfo=function(){var t=Xt(),e=function(t){return t};for(var r in null!==m&&(e=Ye.encryptor(t,0)),ht("<<"),ht("/Producer ("+Ce(e("jsPDF "+M.version))+")"),xt)xt.hasOwnProperty(r)&&xt[r]&&ht("/"+r.substr(0,1).toUpperCase()+r.substr(1)+" ("+Ce(e(xt[r]))+")");ht("/CreationDate ("+Ce(e(W))+")"),ht(">>"),ht("endobj")},Re=y.__private__.putCatalog=function(t){var e=(t=t||{}).rootDictionaryObjId||Qt;switch(Xt(),ht("<<"),ht("/Type /Catalog"),ht("/Pages "+e+" 0 R"),mt||(mt="fullwidth"),mt){case"fullwidth":ht("/OpenAction [3 0 R /FitH null]");break;case"fullheight":ht("/OpenAction [3 0 R /FitV null]");break;case"fullpage":ht("/OpenAction [3 0 R /Fit]");break;case"original":ht("/OpenAction [3 0 R /XYZ null null 1]");break;default:var r=""+mt;"%"===r.substr(r.length-1)&&(mt=parseInt(mt)/100),"number"==typeof mt&&ht("/OpenAction [3 0 R /XYZ null null "+R(mt)+"]")}switch(Nt||(Nt="continuous"),Nt){case"continuous":ht("/PageLayout /OneColumn");break;case"single":ht("/PageLayout /SinglePage");break;case"two":case"twoleft":ht("/PageLayout /TwoColumnLeft");break;case"tworight":ht("/PageLayout /TwoColumnRight")}yt&&ht("/PageMode /"+yt),Tt.publish("putCatalog"),ht(">>"),ht("endobj")},Te=y.__private__.putTrailer=function(){ht("trailer"),ht("<<"),ht("/Size "+(et+1)),ht("/Root "+et+" 0 R"),ht("/Info "+(et-1)+" 0 R"),null!==m&&ht("/Encrypt "+Ye.oid+" 0 R"),ht("/ID [ <"+V+"> <"+V+"> ]"),ht(">>")},Ue=y.__private__.putHeader=function(){ht("%PDF-"+w),ht("%ºß¬à")},ze=y.__private__.putXRef=function(){var t="0000000000";ht("xref"),ht("0 "+(et+1)),ht("0000000000 65535 f ");for(var e=1;e<=et;e++){"function"==typeof rt[e]?ht((t+rt[e]()).slice(-10)+" 00000 n "):void 0!==rt[e]?ht((t+rt[e]).slice(-10)+" 00000 n "):ht("0000000000 00000 n ")}},He=y.__private__.buildDocument=function(){ut(),lt(nt),Tt.publish("buildDocument"),Ue(),oe(),Se(),xe(),null!==m&&be(),De(),Re();var t=it;return ze(),Te(),ht("startxref"),ht(""+t),ht("%%EOF"),lt(ot[$]),nt.join("\n")},We=y.__private__.getBlob=function(t){return new Blob([dt(t)],{type:"application/pdf"})},Ve=y.output=y.__private__.output=Fe((function(t,e){switch("string"==typeof(e=e||{})?e={filename:e}:e.filename=e.filename||"generated.pdf",t){case void 0:return He();case"save":y.save(e.filename);break;case"arraybuffer":return dt(He());case"blob":return We(He());case"bloburi":case"bloburl":if(void 0!==r.URL&&"function"==typeof r.URL.createObjectURL)return r.URL&&r.URL.createObjectURL(We(He()))||void 0;i.warn("bloburl is not supported by your system, because URL.createObjectURL is not supported by your browser.");break;case"datauristring":case"dataurlstring":var n="",a=He();try{n=u(a)}catch(t){n=u(unescape(encodeURIComponent(a)))}return"data:application/pdf;filename="+e.filename+";base64,"+n;case"pdfobjectnewwindow":if("[object Window]"===Object.prototype.toString.call(r)){var o="https://cdnjs.cloudflare.com/ajax/libs/pdfobject/2.1.1/pdfobject.min.js",s=' integrity="sha512-4ze/a9/4jqu+tX9dfOqJYSvyYd5M6qum/3HpCLr+/Jqf0whc37VUbkpNGHR7/8pSnCFw47T1fmIpwBV7UySh3g==" crossorigin="anonymous"';e.pdfObjectUrl&&(o=e.pdfObjectUrl,s="");var c=' + + diff --git a/manager-admin/src/main/resources/templates/indicator/add_evaluation.html b/manager-admin/src/main/resources/templates/indicator/add_evaluation.html deleted file mode 100644 index f4089a0..0000000 --- a/manager-admin/src/main/resources/templates/indicator/add_evaluation.html +++ /dev/null @@ -1,60 +0,0 @@ -

-
- - - - - -
- - -
-
-
- - -
-
-
- - - -
-
-
- - -
-
-
- - - -
-
-
- - -
-
-
- -
\ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/indicator/evaluation_list.html b/manager-admin/src/main/resources/templates/indicator/evaluation_list.html index 217077d..7cf4506 100644 --- a/manager-admin/src/main/resources/templates/indicator/evaluation_list.html +++ b/manager-admin/src/main/resources/templates/indicator/evaluation_list.html @@ -1,182 +1,283 @@ + + -
-
-
+
+
+
-
+ +
- -
-
-

选择评价指标 - 必填 -

-
-
-
- -
- +
+ +
+
+
指标数据评价集
+ -
选定后,下方“评价集设置”将随之变化
-
-
- -
-
-
评价集设置
- -
+
-
-
- - -
-
-
-
- + +
+
+
1. 选择指标(根指标)
+
+
+
+
+ +
+
+ +
+
选择根指标后,再选择设施与 CSV 以建立映射。
- -
-
- - - - - - - - - - - - - - - - - - - - - - - -
序号名称符号下限值符号上限值
- 编辑 - 删除 -
+ + + +
+
+
2. 底部指标区间设置
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + +
等级名上限下限等于
+
+
+
+ +
+
+
-
+
-
-
-
-
-
+ \ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html b/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html index 00d8396..ce67b17 100644 --- a/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html +++ b/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html @@ -81,8 +81,10 @@
3. 上传 CSV 文件
- + + 未选择文件 +
上次上传文件: @@ -158,7 +160,7 @@
- + + @@ -108,8 +110,9 @@ formData.forEach((value, key) => { object[key] = value; }); + object.password = encryptPassword( object.password,object.aesKey,object.aesIv); var jsonData = JSON.stringify(object); - console.log("转换得到的 JSON 数据:", jsonData); + // 从 form 的 action 属性获取 URL(Thymeleaf 渲染后会转换为实际地址) var formAction = this.getAttribute('action'); @@ -145,7 +148,7 @@ document.getElementById(item.elementId + "_error_tip").innerHTML = item.message; } } - if(data.code===500){//提交错误 + if(data.code===10001){//提交错误 document.getElementById("error_message").innerHTML = data.message; document.getElementById("error_message").style.display = "block"; } diff --git a/manager-admin/src/main/resources/templates/project/datasource_csv.html b/manager-admin/src/main/resources/templates/project/datasource_csv.html index 5be367e..dd03a0e 100644 --- a/manager-admin/src/main/resources/templates/project/datasource_csv.html +++ b/manager-admin/src/main/resources/templates/project/datasource_csv.html @@ -1,9 +1,11 @@ - + + - + +
@@ -14,10 +16,10 @@
@@ -32,59 +34,27 @@
选择上传文件
- +
+
+
+ + +
+ +
-
+ +
-
+

-
-
-
- Show -
- -
- entries -
-
- Search: -
- -
-
-
-
-
- - - - - - - - - - - - - - - - - -
No. - - Invoice SubjectClientVAT No.CreatedStatusPrice
-
- +
diff --git a/manager-admin/src/main/resources/templates/project/datasource_db.html b/manager-admin/src/main/resources/templates/project/datasource_db.html index 2b77b99..3397922 100644 --- a/manager-admin/src/main/resources/templates/project/datasource_db.html +++ b/manager-admin/src/main/resources/templates/project/datasource_db.html @@ -2,9 +2,9 @@ - +
-
+ + +

数据库记录

diff --git a/manager-admin/src/main/resources/templates/project/datasource_select.html b/manager-admin/src/main/resources/templates/project/datasource_select.html index 203b823..c32f9e9 100644 --- a/manager-admin/src/main/resources/templates/project/datasource_select.html +++ b/manager-admin/src/main/resources/templates/project/datasource_select.html @@ -1,7 +1,8 @@
-
+
33% Complete
@@ -9,7 +10,9 @@
@@ -18,43 +21,62 @@
-
-

选择数据源/评价方法

-
+
+

选择数据源/模糊综合评价方法

+
-
-
-
-
数据源
-
- - +
+
+
-
-
-
-
评价方法
-
- - -
-
+ +
1.选择数据源
+
+ + +
+ +
+ +
+
2.模糊运算方式
+
+ + + + + +
+ +
+
diff --git a/manager-admin/src/main/resources/templates/project/evaluation_history.html b/manager-admin/src/main/resources/templates/project/evaluation_history.html new file mode 100644 index 0000000..ae049b6 --- /dev/null +++ b/manager-admin/src/main/resources/templates/project/evaluation_history.html @@ -0,0 +1,42 @@ +
+
+
+
工程评估历史
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
创建时间数据来源隶属函数模糊运算算子
隶属函数模糊运算算子 + +
+
+
+ +
+
\ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/project/evaluation_report.html b/manager-admin/src/main/resources/templates/project/evaluation_report.html new file mode 100644 index 0000000..575b04a --- /dev/null +++ b/manager-admin/src/main/resources/templates/project/evaluation_report.html @@ -0,0 +1,748 @@ + + + +
+ +
+ +
+ +
+ + + +

+

基于层次分析法的多维度综合评估

+
+ + + + + 评价方法:模糊综合评价法 +
+
+ + +
+

📊 摘要信息

+
+
+
+
综合得分
+
+
+
+
评价等级
+
+
+
70.0%
+
优良率
+
+
+
10
+
底层指标数
+
+
+ +
+ + +
+

🔬 评价方法论

+
+
+
1
+
构建指标体系
+
建立3级指标体系,包含学术能力、社会影响、个人发展等维度
+
+
+
2
+
确定权重分配
+
运用层次分析法确定各级指标权重,确保评价体系的科学性
+
+
+
3
+
隶属度计算
+
建立模糊评价矩阵,计算各指标对不同等级的隶属度
+
+
+
4
+
综合评价
+
运用模糊综合评价算法,得出最终评价结果和等级分布
+
+
+
+ + +
+

📈 评价结果分析

+
+
+

隶属度等级分布

+
+
+ +
+
+
+

一级维度得分对比

+
+ + +
+
+
+
+ + +
+
+

📋 详细评价数据

+
+
+ + + + + + + + + + + + +
指标名称权重隶属度分布综合得分等级
+
+
+ + +
+ + diff --git a/manager-admin/src/main/resources/templates/project/evaluation_root_history.html b/manager-admin/src/main/resources/templates/project/evaluation_root_history.html new file mode 100644 index 0000000..a3381e0 --- /dev/null +++ b/manager-admin/src/main/resources/templates/project/evaluation_root_history.html @@ -0,0 +1,54 @@ +
+
+
+
指标评估记录
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + +
NO.名称最终分数隶属度
+ + + + + + + + + +
+
+
+ +
+
\ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/project/list.html b/manager-admin/src/main/resources/templates/project/list.html index 34efa0c..0361927 100644 --- a/manager-admin/src/main/resources/templates/project/list.html +++ b/manager-admin/src/main/resources/templates/project/list.html @@ -60,7 +60,7 @@ - 评估历史 + 评估结果 @@ -132,9 +132,17 @@ } function _projectHistory(id) { - + let url = document.getElementById("_rootPath").value + + "evaluation/project/root_history?projectId=" + id + let http = new HttpClient(); + http.get(url, function (err, res, xhr) { + openDialog("modal-full-width-no-btn"); + document.getElementById("add-full-screen-form-modal-body-no-btn").innerHTML = res; + }, null) } + //选择开始评估时触发 + //缓存projectId+randomId function _startEvaluation(id) { let randomKey = generateDraftKey().replace("tpl:new:", "") let url = document.getElementById("_rootPath").value @@ -149,6 +157,7 @@ } //选择了数据源后触发 + //缓存projectId+randomId+method function selectedDatasource(projectId) { //获取选中的数据源 @@ -156,12 +165,15 @@ let method = $('input[name="aggregationMethod"]:checked').val(); var url = ""; if (value === 'database') { - url = document.getElementById("_rootPath").value + "evaluation/project/database?id=" - + projectId + "&randomKey=" + document.getElementById("stepForm")['randomKey'].value+"&method=" + method; + url = document.getElementById("_rootPath").value + "evaluation/project/database?projectId=" + + projectId + "&randomKey=" + document.getElementById("stepForm")['randomKey'].value + + "&method=" + method; } if (value === 'dataCsv') { - url = document.getElementById("_rootPath").value + "evaluation/project/csv?id=" + projectId - + "&randomKey=" + document.getElementById("stepForm")['randomKey'].value+"&method="+method; + url = document.getElementById("_rootPath").value + "evaluation/project/csv?projectId=" + + projectId + + "&randomKey=" + document.getElementById("stepForm")['randomKey'].value + "&method=" + + method; } let http = new HttpClient(); http.get(url, function (error, response, xhr) { @@ -170,11 +182,28 @@ }, null); } + function getSelectRecord() { + const ids = []; + document.getElementsByName("list_map_table_checkbox").forEach(checkbox => { + if (checkbox.checked === true) { + ids.push(checkbox.value); + } + }) + return ids; + } + function processEvaluation() { const url = document.getElementById("_rootPath").value + "evaluation/project/processEvaluation"; - const http = new HttpClient(); - const form = document.getElementById("stepForm"); + const http = new HttpClient(); + const ids = getSelectRecord(); + let identifier = ''; + if (form['datasource'].value === 'csv') { + identifier = form['csv_identifier'].value; + } else { + identifier = "name";//数据库类型约定为name + } + const obj = { datasourceType: form['datasource'].value, modelId: form['modelId'].value, @@ -183,6 +212,9 @@ search: form['search'].value, randomKey: form['randomKey'].value, method: form['method'].value, + ids: ids, + identifier: identifier, + }; http.post(url, obj, function (error, response, xhr) { @@ -259,5 +291,506 @@ wrap.scrollTop = wrap.scrollHeight; } + function readCsv() { + const $files = document.getElementById("csv_file"); + const fs = $files.files; + if (fs.length === 0) { + return; + } + const MAX = 10 * 1024 * 1024; // 10MB + const $form = document.getElementById("stepForm"); + if (fs[0].size > MAX) { + showAlert("Error", "文件太大了!限制是 " + (MAX / 1024 / 1024) + "MB") + $files.value = ""; // 清空选择 + return; + } + const formData = new FormData(); + formData.append("modelId", $form['modelId'].value); + formData.append("projectId", $form['projectId'].value); + formData.append("datasource", "csv"); + formData.append("search", $form['search'].value); + formData.append("randomKey", $form['randomKey'].value); + formData.append("method", $form['method'].value); + formData.append("file", fs[0]); + let url = document.getElementById("_rootPath").value + "evaluation/project/uploadCsv"; + fetch(url, { + method: "POST", + body: formData + }) + .then(res => res.text()) + .then(data => { + + openDialog("modal-full-width-no-btn"); + document.getElementById("add-full-screen-form-modal-body-no-btn").innerHTML = data; + + }) + .catch(err => { + console.error(err); + showAlert("Error", "上传失败") + + }); + + } + + //查看结果 + function viewResult(element) { + const resultId = element.getAttribute('data-result-id'); + let url = document.getElementById("_rootPath").value + "evaluation/project/report" + + let http = new HttpClient(); + http.get(url, function (error, response, xhr) { + + openDialog("modal-full-width-no-btn"); + document.getElementById("add-full-screen-form-modal-body-no-btn").innerHTML = response; + let dataUrl = document.getElementById("_rootPath").value + "evaluation/project/reportData?id=" + + resultId; + http.get(dataUrl, function (error, reportData, xhr) { + if (reportData.result.result) { + let rootResult = reportData.result.result; + document.getElementById("report-title").innerHTML = rootResult.indicatorName + "评价报告"; + document.getElementById("report-meta-object").innerHTML = "评价对象:" + + rootResult.identifier; + document.getElementById("report-meta-date").innerHTML = "报告日期:" + + rootResult.createTimeStr; + document.getElementById("object_score").innerHTML = rootResult.finalScore; + document.getElementById("object_level").innerHTML = rootResult.levelName; + + document.getElementById("highRate").innerHTML = reportData.result.highRate + "%"; + document.getElementById("bottomNum").innerHTML = reportData.result.bottomNum; + createPieChart(reportData.result.pieDataList); + + // 渲染 & 自适应 + renderBarChart('#radarChart', reportData.result.barDataList, + {domainMax: 100, target: 80}); + + populateTable(reportData.result.dataNodeList) + } + }, null); + + }, null) + } + + // D3.js 创建饼图 - 横向图例 + function createPieChart(data) { + const svgWidth = 240; + const svgHeight = 200; + const radius = Math.min(svgWidth, svgHeight) / 2 - 10; + + // 清洗:确保 value 是数字;过滤 <=0 + const rows = (data || []) + .map(d => ({label: d.label, value: +d.value, color: d.color})) + .filter(d => d.value > 0); + + const wrapper = d3.select('#pieChartWrapper'); + wrapper.selectAll('*').remove(); + + if (rows.length === 0) { + wrapper.append('div').text('无可展示的数据'); + return; + } + + // SVG + const svg = wrapper.append('div').attr('class', 'pie-chart-svg') + .append('svg') + .attr('width', svgWidth) + .attr('height', svgHeight) + .attr('class', 'pie-chart'); + + const g = svg.append('g') + .attr('transform', `translate(${svgWidth / 2},${svgHeight / 2})`); + + const pie = d3.pie().value(d => d.value).sort(null); + const arc = d3.arc().innerRadius(0).outerRadius(radius); + const labelArc = d3.arc().innerRadius(radius * 0.7).outerRadius(radius * 0.7); + + const arcs = g.selectAll('.arc') + .data(pie(rows)) + .enter().append('g') + .attr('class', 'arc'); + + // 扇形:这里用 d.data.color + arcs.append('path') + .attr('d', arc) + .attr('fill', d => d.data.color || '#999') + .attr('stroke', 'white') + .attr('stroke-width', 2) + .style('cursor', 'pointer') + .on('mouseover', function () { + d3.select(this).style('opacity', 0.8); + }) + .on('mouseout', function () { + d3.select(this).style('opacity', 1); + }); + + // 标签:用 d.data.value + arcs.append('text') + .attr('transform', d => `translate(${labelArc.centroid(d)})`) + .attr('text-anchor', 'middle') + .attr('dominant-baseline', 'middle') + .style('font-size', '12px') + .style('font-weight', '600') + .style('fill', 'white') + .text(d => d.data.value >= 5 ? `${d.data.value.toFixed(0)}%` : ''); + + // 图例:这里用 rows(原始数据),不是 d.data + const legend = wrapper.append('div').attr('class', 'pie-legend'); + rows.forEach(d => { + const item = legend.append('div').attr('class', 'legend-item'); + item.append('div').attr('class', 'legend-color').style('background-color', d.color || '#999'); + item.append('span').text(`${d.label} (${d.value.toFixed(1)}%)`); + }); + } + + + + function populateTable(reportData) { + const tbody = document.getElementById('indicatorTable'); + tbody.innerHTML = ''; + + reportData.forEach((item, index) => { + + const row = document.createElement('tr'); + const scoreInfo = getScoreLevel(item.evaluation); + const pathDisplay = createPathDisplay(item, reportData); + + row.innerHTML = ` + +
+
+
+ ${pathDisplay} +
${item.name}
+
+
+ + +
+
${(item.weight * 100).toFixed(0)}%
+
+
+
+
+ + ${createMembershipDistributionVisualization(item.membershipDist)} + ${item.score.toFixed( + 1)} + ${scoreInfo.level} + `; + + tbody.appendChild(row); + }); + } + + function createMembershipDistributionVisualization(membershipDist) { + const total = membershipDist.poor + membershipDist.fair + membershipDist.good + + membershipDist.excellent; + + const poorWidth = (membershipDist.poor / total) * 100; + const fairWidth = (membershipDist.fair / total) * 100; + const goodWidth = (membershipDist.good / total) * 100; + const excellentWidth = (membershipDist.excellent / total) * 100; + + let segmentHtml = ''; + + if (poorWidth > 0) { + segmentHtml += `
${membershipDist.poor}%
`; + } + if (fairWidth > 0) { + segmentHtml += `
${membershipDist.fair}%
`; + } + if (goodWidth > 0) { + segmentHtml += `
${membershipDist.good}%
`; + } + if (excellentWidth > 0) { + segmentHtml += `
${membershipDist.excellent}%
`; + } + + return ` +
+
+ 差: ${membershipDist.poor}% + 可: ${membershipDist.fair}% + 良: ${membershipDist.good}% + 优: ${membershipDist.excellent}% +
+
+ ${segmentHtml} +
+
+ `; + + } + + function createPathDisplay(item, reportData) { + const path = buildPath(item, reportData); + if (path.length === 1) { + return ''; + } + + const pathItems = path.slice(0, -1).map((pathItem, index) => { + return `${pathItem}`; + }).join(''); + + return `
${pathItems}
`; + } + + function buildPath(item, reportData) { + + const path = []; + let current = item; + + while (current) { + path.unshift(current.name); + if (current.parent) { + current = reportData.find(node => node.id === current.parent); + } else { + break; + } + } + + return path; + } + + // 四级评价等级判定 + function getScoreLevel(evaluation) { + + if (evaluation === '优') { + return {level: '优', class: 'score-excellent'}; + } + if (evaluation === '良') { + return {level: '良', class: 'score-good'}; + } + if (evaluation === '可') { + return {level: '可', class: 'score-fair'}; + } + return {level: '差', class: 'score-poor'}; + } + + function viewRootList(obj) { + let randomKey = obj.dataset.resultId; + let projectId = obj.dataset.projectId; + let url = document.getElementById("_rootPath").value + + "evaluation/project/root_history_by_randomKey?randomKey=" + randomKey + "&projectId=" + + projectId; + let http = new HttpClient(); + http.get(url, function (err, res, xhr) { + + document.getElementById("add-full-screen-form-modal-body-no-btn").innerHTML = res; + + }, null); + + } + + function goToHistory(obj) { + let url = document.getElementById("_rootPath").value + "evaluation/project/history?projectId=" + + obj.dataset.resultId; + let http = new HttpClient(); + http.get(url, function (err, res, xhr) { + + document.getElementById("add-full-screen-form-modal-body-no-btn").innerHTML = res; + + }, null); + } + + // PDF下载功能 + async function downloadPDF() { + const pdfBtn = document.getElementById('pdfBtn'); + const btnText = document.getElementById('btnText'); + const btnSpinner = document.getElementById('btnSpinner'); + + pdfBtn.disabled = true; + btnText.style.display = 'none'; + btnSpinner.style.display = 'inline-block'; + + try { + const {jsPDF} = window.jspdf; + const element = document.getElementById('reportContent'); + + // 1. 降低 scale + const canvas = await html2canvas(element, { + scale: 2, + useCORS: true, + backgroundColor: '#ffffff', + logging: false + }); + + const imgData = canvas.toDataURL('image/png'); + const pdf = new jsPDF('p', 'mm', 'a4'); + const imgWidth = 210; + const pageHeight = 295; + const imgHeight = (canvas.height * imgWidth) / canvas.width; + let heightLeft = imgHeight; + let position = 0; + + pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight); + heightLeft -= pageHeight; + + while (heightLeft >= 0) { + position = heightLeft - imgHeight; + pdf.addPage(); + pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight); + heightLeft -= pageHeight; + } + + const fileName = `模糊综合评价报告_${new Date().toISOString().slice(0, 10)}.pdf`; + pdf.save(fileName); + + } catch (error) { + console.error('PDF生成失败:', error); + alert('PDF生成失败,请稍后重试'); + } finally { + pdfBtn.disabled = false; + btnText.style.display = 'inline'; + btnSpinner.style.display = 'none'; + } + } + + /** + * 横向条形图(替换雷达)— 对齐刻度的稳定版 + * @param {string|SVGElement} svgSel + * @param {{name:string,score:number}[]} data + * @param {{domainMax?:number, sortAsc?:boolean, target?:number, margin?:object}} opts + */ + function renderBarChart(svgSel, data, opts = {}) { + + const cfg = Object.assign({ + sortAsc: true, + domainMax: 100, // 轴与条的统一上限 + target: 80, + margin: {top: 24, right: 120, bottom: 30, left: 200} + }, opts); + + const src = (data || []).map(d => ({...d})); + if (cfg.sortAsc) { + src.sort((a, b) => d3.ascending(a.score, b.score)); + } + + const svg = d3.select(svgSel); + // 防止二次渲染/行为残留 + svg.on('.zoom', null).on('.drag', null); + + const parent = svg.node().parentNode; + const W = parent.clientWidth || 800; + const H = parent.clientHeight || Math.max(240, + src.length * 40 + cfg.margin.top + cfg.margin.bottom); + + svg.attr('width', W).attr('height', H) + .attr('viewBox', `0 0 ${W} ${H}`) + .attr('preserveAspectRatio', 'xMidYMid meet') + .selectAll('*').remove(); + + const {top, right, bottom, left} = cfg.margin; + const width = Math.max(50, W - left - right); + const innerH = Math.max(20, H - top - bottom); + const gap = 10; + const barH = Math.max(16, + Math.min(32, (innerH - (src.length - 1) * gap) / Math.max(1, src.length))); + + const g = svg.append('g').attr('transform', `translate(${left},${top})`); + + // ★ 唯一 x 比例尺(条/轴/目标线/网格全部用它) + const x = d3.scaleLinear() + .domain([0, cfg.domainMax]) // 不用 nice,严格 0..domainMax + .range([0, width]) + .clamp(true); + + const y = d3.scaleBand() + .domain(src.map(d => d.name)) + .range([0, src.length * (barH + gap) - gap]) + .paddingInner(gap / (barH + gap)); + + const color = d3.scaleLinear() + .domain([0.5 * cfg.domainMax, 0.75 * cfg.domainMax, 0.9 * cfg.domainMax]) + .range(['#ef4444', '#f59e0b', '#10b981']) + .clamp(true); + + // 背景“轨道”,直观看出满刻度宽度 + g.selectAll('.bar-track').data(src).enter().append('rect') + .attr('class', 'bar-track') + .attr('x', 0).attr('y', d => y(d.name)) + .attr('width', width).attr('height', barH) + .attr('rx', 8).attr('ry', 8) + .attr('fill', '#e5e7eb'); + + // clipPath,保证条不会超过满刻度 + g.append('clipPath').attr('id', 'clip-fullwidth') + .append('rect').attr('x', 0).attr('y', 0).attr('width', width).attr('height', y.range()[1]); + + // 条形 + const row = g.selectAll('.bar-row').data(src).enter().append('g') + .attr('class', 'bar-row') // ← 不再用 .row,避免和框架冲突 + .attr('transform', d => `translate(0,${y(d.name)})`); + + row.append('rect') + .attr('clip-path', 'url(#clip-fullwidth)') + .attr('height', barH) + .attr('width', d => x(d.score)) + .attr('fill', d => color(d.score)) + .attr('rx', 8).attr('ry', 8) + .attr('shape-rendering', 'crispEdges'); + + // 左侧分类名 + row.append('text') + .attr('x', -10).attr('y', barH / 2).attr('dy', '.35em') + .attr('text-anchor', 'end') + .attr('fill', '#0f172a').attr('font-weight', 700) + .text(d => d.name); + + // 右侧分数(贴在条尾) + row.append('text') + .attr('x', d => x(d.score) + 8).attr('y', barH / 2).attr('dy', '.35em') + .attr('fill', '#0f172a').attr('font-weight', 800).attr('font-size', 18) + .text(d => d.score.toFixed(1)); + + // 最低分标注 + const minScore = d3.min(src, d => d.score); + row.filter(d => d.score === minScore).append('text') + .attr('x', d => x(d.score) + 8).attr('y', barH / 2 + 16) + .attr('fill', '#ef4444').attr('font-weight', 800).attr('font-size', 12) + .text('LOWEST'); + + // 底部 x 轴(和条共用 x) + const axis = g.append('g') + .attr('transform', `translate(0,${y.range()[1]})`) + .call(d3.axisBottom(x).ticks(6).tickSizeOuter(0)); + axis.selectAll('path,line').attr('stroke', '#e5e7eb'); + + // 垂直网格线(对齐检查) + g.selectAll('.grid-v').data(x.ticks(6)).enter().append('line') + .attr('class', 'grid-v') + .attr('x1', d => x(d)).attr('x2', d => x(d)) + .attr('y1', 0).attr('y2', y.range()[1]) + .attr('stroke', '#cbd5e1').attr('stroke-dasharray', '2,4'); + + // 目标线(可选) + if (typeof cfg.target === 'number') { + g.append('line') + .attr('x1', x(cfg.target)).attr('x2', x(cfg.target)) + .attr('y1', 0).attr('y2', y.range()[1]) + .attr('stroke', '#94a3b8').attr('stroke-dasharray', '4,4'); + g.append('text') + .attr('x', x(cfg.target) + 6).attr('y', -6) + .attr('fill', '#64748b').attr('font-size', 12) + .text(`目标 ${cfg.target}`); + } + } + function dynamic_search(){ + let value = $('input[name="datasource_type"]:checked').val(); + let url = document.getElementById("_rootPath").value; + if(value==='database'){ + url = url+"evaluation/project/database"; + }else{ + url = url+"evaluation/project/csv"; + } + //组装参数 + let qs = formToQueryString('stepForm'); + url = url+"?"+qs; + + let http = new HttpClient(); + http.get(url, function (error, response, xhr) { + openDialog("modal-full-width-no-btn"); + document.getElementById("add-full-screen-form-modal-body-no-btn").innerHTML = response; + }, null); + } \ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/project/project_evaluation_process.html b/manager-admin/src/main/resources/templates/project/project_evaluation_process.html index 82ba651..71186e3 100644 --- a/manager-admin/src/main/resources/templates/project/project_evaluation_process.html +++ b/manager-admin/src/main/resources/templates/project/project_evaluation_process.html @@ -43,8 +43,3 @@
-
-
-
评估结果
-
-
\ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/project_template/list.html b/manager-admin/src/main/resources/templates/project_template/list.html index 956e2fa..ec7dcc8 100644 --- a/manager-admin/src/main/resources/templates/project_template/list.html +++ b/manager-admin/src/main/resources/templates/project_template/list.html @@ -131,7 +131,7 @@ JSON.stringify(query)) document.getElementById("_evaluation_evaluationTemplate_").click(); } - + //编辑模板信息 function _templateEdit(id) { let url = document.getElementById("_rootPath").value + "evaluation/evaluationTemplate/" + id; let http = new HttpClient(); @@ -140,7 +140,7 @@ _toAdd(res.result); }, 'templateForm') } - + //保存模板信息 function saveTemplate() { let obj = {}; obj.id = document.getElementById("templateForm")["id"].value; @@ -148,60 +148,98 @@ obj.templateMemo = document.getElementById("templateForm")["templateMemo"].value; obj.indicatorTopId = document.getElementById("templateForm")["indicatorTopId"].value; const inst = $('#metric_tree').jstree(true); - - const flat = inst.get_json('#', { flat: true, no_data: false }); + //指标的权重信息 + let indicatorWeightList = []; + //指标之间互比的权重信息 + let templateDetailWeightList = []; + const flat = inst.get_json('#', {flat: true, no_data: false}); flat.forEach(n => { + if (n.data) { + let weightObj = {}; + + weightObj.indicatorId = parseInt(n.id.replace(/^tree_/, "")); + weightObj.weight = n.data.weight; + indicatorWeightList.push(weightObj); + if(n.data.children&&n.data.children.length > 0) { + for (const v of n.data.children) { + for (const w of v) { + templateDetailWeightList.push(w); + + } + + } + } + } console.log(`[id=${n.id}] parent=${n.parent} text="${n.text}"`, n.data || {}); }); + obj.indicatorWeightList = indicatorWeightList; + obj.templateDetailWeightList = templateDetailWeightList; + let url = document.getElementById("_rootPath").value + "evaluation/evaluationTemplate/save" ; + let http = new HttpClient(); + http.post(url,obj, function (error, res, xhr) { + closeDialog("modal-full-width"); + document.getElementById("_evaluation_evaluationTemplate_").click(); + + },null,null) } // 根据指标ID获取指标树 function metricTree(id) { - let templateId = document.getElementById("templateForm")["id"].value; - if (!templateId || templateId === "") { - templateId = "0" - } - const url = document.getElementById("_rootPath").value - + "evaluation/evaluationTemplate/metricTree/" + id + "/" + templateId; + // 1) 读取并规范化 id + const form = document.getElementById('templateForm'); + let templateId = form && form.elements['id'] ? form.elements['id'].value : '0'; + const mid = Number(id || 0); + const tid = Number(templateId || 0); + if (mid === 0 && tid === 0) return; + + // 2) 计算 URL + const base = (document.getElementById('_rootPath') || {}).value || ''; + const url = base + 'evaluation/evaluationTemplate/metricTree/' + mid + '/' + tid; + const http = new HttpClient(); - http.get(url, function (error, res, xhr) { + if (error) { console.error('metricTree http error:', error); return; } + const $tree = $('#metric_tree'); + if (!$tree.length) { console.error('#metric_tree not found'); return; } + if (!$.fn || !$.fn.jstree) { console.error('jsTree plugin not loaded'); return; } - // 如已有实例,先销毁并清空 - if ($.jstree.reference($tree)) { + // 3) 解析数据 + let data = (res && (res.result ?? res.data ?? res)) || []; + if (typeof data === 'string') { try { data = JSON.parse(data); } catch (e) {} } + if (!Array.isArray(data)) data = []; - $tree.jstree(true).destroy(); - $tree.empty(); - } + // 4) 安全销毁旧实例并清空 + try { + const inst = $tree.jstree(true); // 未初始化时为 undefined + if (inst) inst.destroy(true); + } catch (e) { console.warn('destroy skipped:', e); } + $tree.empty(); - // 重新初始化 + // 5) 重新初始化 + 事件绑定(先 off 再 on) + $tree.off('.jstree'); $tree.jstree({ - core: {data: res.result, check_callback: true} + core: { data: data, check_callback: true }, + plugins: ['wholerow'] // 需要其他插件再加:'checkbox','types','search' 等 }); - // 树加载完 → 自动选中第一个根节点(触发 select 事件,从而 drawTable 一次) - $tree.off("loaded.jstree").on("loaded.jstree", function (e, data) { - const roots = data.instance.get_node('#').children || []; - if (roots.length > 0) { - data.instance.select_node(roots[0]); // 会触发 select_node.jstree - } + // 树 ready 后再取实例并选中第一个根节点 + $tree.one('ready.jstree', function () { + const inst = $tree.jstree(true); + const roots = inst.get_node('#').children || []; + if (roots.length) inst.select_node(roots[0]); // 触发 select_node.jstree }); - // 绑定选择事件(避免重复绑定) - $tree.off("select_node.jstree").on("select_node.jstree", function (e, data) { - //暂存数据 - - let id = data.node.id || ""; - id = id.replace(/^tree_/, ""); - getTablePage(id); - + // 选择事件(避免重复绑定) + $tree.off('select_node.jstree').on('select_node.jstree', function (e, dataEvt) { + let nid = (dataEvt.node.id || '').replace(/^tree_/, ''); + getTablePage(nid); }); - - }, "templateForm"); + }, 'templateForm'); } + //绘制表格 function getTablePage(indicatorId) { @@ -215,9 +253,20 @@ //绘制当前选中的指标下的children值 const inst = $('#metric_tree').jstree(true); - const node =inst.get_selected(true)[0]; - if(node.data.children){ - console.log(node.data.children); + const node = inst.get_selected(true)[0]; + + if (node.data.children) { + + for (const v of node.data.children) { + console.log(v); + for (const w of v) { + if (document.getElementById(w.rowId + "_" + w.colId)) { + document.getElementById(w.rowId + "_" + w.colId).value = w.value; + } + } + + } + } }, null) @@ -262,7 +311,7 @@ let node = inst.get_node(id, false); let name = node.text.replace(/\([^)]*\)/g, ""); name = name + "(" + element.weight + ")"; - node.data.weight = element.weight; + node.data.weight = element.weight; inst.rename_node(node, name); }) }, null, null) @@ -356,6 +405,7 @@ } return map; } + //获取表头元素 function getTableHeadData() { let tr = document.getElementById("dynamic_header_tr"); diff --git a/manager-admin/src/main/resources/templates/system/indicator/indicator_set.html b/manager-admin/src/main/resources/templates/system/indicator/indicator_set.html new file mode 100644 index 0000000..5757039 --- /dev/null +++ b/manager-admin/src/main/resources/templates/system/indicator/indicator_set.html @@ -0,0 +1,190 @@ + +
+
+ +
+
+ +
+ +
+
+
+
1.全局默认表(等级名/代表分)
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
等级名代表分
+ + + +
+ + + +
+ + + +
+ + + +
+
+
+
+ +
+ + +
+
+
2.全局默认隶属函数设置
+
+
+
+
+
+ +
+ +
+
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+ + +
+
+
+ + + \ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/system/log/general_detail.html b/manager-admin/src/main/resources/templates/system/log/general_detail.html new file mode 100644 index 0000000..5bd9ab1 --- /dev/null +++ b/manager-admin/src/main/resources/templates/system/log/general_detail.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
url
+
+
+
+ +
操作人
+
+
+
+ +
IP
+
+
+
+ +
消息
+
+
+
+ +
时间
+
+
+
+ +
请求参数
+
+
+
+
+ +
+
+
+
+ +
错误信息
+
+
+
+
+ +
+
+
+ diff --git a/manager-admin/src/main/resources/templates/system/log/list.html b/manager-admin/src/main/resources/templates/system/log/list.html new file mode 100644 index 0000000..6a02b07 --- /dev/null +++ b/manager-admin/src/main/resources/templates/system/log/list.html @@ -0,0 +1,140 @@ + +
+
+ +
+
+ +
+
+
+

日志列表

+ +
+
+
+ + +
+
+ + +
+ 显示 +
+ +
+ 记录/每页 +
+ + +
+ + +
+ 消息类型 + + +
+ + +
+ + +
+ +
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
No. + + + + + + 消息时间操作人IP日志类型审计
+ + + + + + + + + + + + + + + + + + 详情 + +
+
+
+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/system/menu/add.html b/manager-admin/src/main/resources/templates/system/menu/add.html index c2b5a87..4c5fe0a 100644 --- a/manager-admin/src/main/resources/templates/system/menu/add.html +++ b/manager-admin/src/main/resources/templates/system/menu/add.html @@ -1,7 +1,7 @@
- +
diff --git a/manager-admin/src/main/resources/templates/system/menu/list.html b/manager-admin/src/main/resources/templates/system/menu/list.html index ad67f61..baf9444 100644 --- a/manager-admin/src/main/resources/templates/system/menu/list.html +++ b/manager-admin/src/main/resources/templates/system/menu/list.html @@ -41,6 +41,7 @@